Car*_*ndo 7 java java-native-interface
基本上,我一直在执行以下操作来检索Java实例字段(在本例中为int)并将其设置为新值,如下所示:
jclass cls = env->GetObjectClass(obj);
jfieldID fid = env->GetFieldID(cls, "myVariable", "I");
env->SetIntField(obj, fid, (jint)2012);
Run Code Online (Sandbox Code Playgroud)
但是,我想为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?>
Run Code Online (Sandbox Code Playgroud)
有这样的事吗?
在查看了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);
Run Code Online (Sandbox Code Playgroud)
ReleaseIntArrayElements是关键...它将一个副本返回给java Instance Variable.
如果您只想更改一个或几个值,我强烈建议您使用SetIntArrayRegion它,因为它可以避免来回复制整个数组。
jintArray jMyArray = (jintArray)env->GetObjectField( obj, fid );
// jMyArray[0] = 2013
jint elements[] = { 2013 };
env->SetIntArrayRegion( jMyArray, 0, 1, elements );
Run Code Online (Sandbox Code Playgroud)
有关更多 JNI 最佳实践,请参阅IBM 的这篇文章;)