2010-09-09 28 views
6

基本上,我一直在做以下檢查Java實例字段(在這種情況下,一個int),並將其設置爲一個新的值以下內容:Java的JNI - 是否有可能在Java中設置一個單獨的基本數組元素從C++

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

不過,我想在一個Java int數組個人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); 

ReleaseIntArrayElements是key ...它將一個副本返回給java實例變量。

+2

,它釋放出()由GetIntArrayElements分配的內存。 – EJP 2010-09-09 23:52:58

+0

使用'GetIntArrayElements'來訪問只有一個元素是浪費。改用'SetIntArrayRegion'。 – Sdra 2013-11-13 11:05:48

2

如果你只想改變一個或幾個值,我強烈建議使用SetIntArrayRegion,因爲它避免了來回複製所有數組。

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

更多JNI的最佳實踐是指從IBM this文章;)

相關問題