2010-09-09 14 views
6

से जावा में एक व्यक्तिगत आदिम सरणी तत्व सेट करना संभव है, मूल रूप से, मैं जावा इंस्टेंस फ़ील्ड (इस मामले में, एक int) को पुनर्प्राप्त करने के लिए निम्न कार्य कर रहा हूं और इसे एक नए मान पर सेट कर रहा हूं निम्नलिखित:जावा जेएनआई - क्या सी ++

jclass cls = env->GetObjectClass(obj); 
jfieldID fid = env->GetFieldID(cls, "myVariable", "I"); 
env->SetIntField(obj, fid, (jint)2012); 

हालांकि, मैं एक जावा int सरणी में एक व्यक्ति पूर्णांक तत्व के लिए यह करने के लिए करना चाहते हैं ऐसा है कि:

jclass cls = env->GetObjectClass(obj); 
jfieldID fid = env->GetFieldID(cls, "myVariableArray", "[I"); 
PSUDOCODE: <"SET myVariableArray[0] = 2013" ... Is there a method for this?> 

ऐसी बात वहाँ है?

उत्तर

7

मुझे 15+ दस्तावेज़ों को देखने के बाद उत्तर मिला।

// Grab Fields 
jclass cls = env->GetObjectClass(obj); 
jfieldID fid = env->GetFieldID(cls, "testField", "[I"); 

jintArray jary; 
jary = (jintArray)env->GetObjectField(obj, fid); 
jint *body = env->GetIntArrayElements(jary, 0); 
body[0] = 3000; 
env->ReleaseIntArrayElements(jary, body, 0); 

रिलीजइन्टअरेअरेइलेमेंट्स महत्वपूर्ण है ... यह जावा इंस्टेंस वेरिएबल पर एक प्रतिलिपि वापस देता है।

+2

और यह() स्मृति GetIntArrayElements द्वारा आवंटित विज्ञप्ति। – EJP

+0

केवल एक तत्व तक पहुंचने के लिए 'GetIntArrayElements' का उपयोग करना एक अपशिष्ट है। इसके बजाय 'SetIntArrayRegion' का उपयोग करें। – Sdra

2

यदि आप केवल एक या कुछ मानों को बदलना चाहते हैं तो मैं अत्यधिक SetIntArrayRegion का उपयोग करने का सुझाव देता हूं क्योंकि यह सभी सरणी को पीछे और पीछे कॉपी करने से बचाता है।

jintArray jMyArray = (jintArray)env->GetObjectField(obj, fid); 
// jMyArray[0] = 2013 
jint elements[] = { 2013 }; 
env->SetIntArrayRegion(jMyArray, 0, 1, elements); 
अधिक JNI सर्वोत्तम प्रथाओं के लिए

आईबीएम से this लेख का संदर्भ लें;)

संबंधित मुद्दे