Java JNI - 是否可以使用C++在Java中设置单独的原始数组元素

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)

有这样的事吗?

Car*_*ndo 8

在查看了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.

  • 它释放由GetIntArrayElements()分配的内存. (2认同)

Sdr*_*dra 5

如果您只想更改一个或几个值,我强烈建议您使用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 的这篇文章;)