2010-09-09 18 views
6

'dan bireysel bir ilkel dizi öğesi ayarlamak mümkün mü? Temel olarak, Java Örnek Alanlarını (bu durumda, bir int) almak ve aşağıdaki gibi yeni bir değere ayarlamak için aşağıdakileri yapıyorum aşağıdaki:Java JNI - Java'da C++

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

Ancak, ben bir java int dizideki tek bir int elemanı için bunu yapmak istiyorum, öyle ki:

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

böyle bir şey var mı?

cevap

7

15'den fazla belgeye baktıktan sonra yanıtı buldum.

// 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); 

ReleaseIntArrayElements anahtardır ... bir kopyasını java Örneği Değişkeni'ne döndürür.

+2

VE o GetIntArrayElements tarafından ayrılan belleği() serbest bırakır. – EJP

+0

Sadece bir öğeye erişmek için 'GetIntArrayElements 'kullanılması bir israftır. Bunun yerine 'SetIntArrayRegion' kullanın. – Sdra

2

Yalnızca bir veya birkaç değeri değiştirmek isterseniz, tüm diziyi ileri geri kopyalamayı engellediğinden SetIntArrayRegion kullanmanızı öneririz. daha JNI'yı iyi uygulamalar için

jintArray jMyArray = (jintArray)env->GetObjectField(obj, fid); 
// jMyArray[0] = 2013 
jint elements[] = { 2013 }; 
env->SetIntArrayRegion(jMyArray, 0, 1, elements); 

IBM'den this makalesine başvurun;)