简体   繁体   English

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

[英]Java JNI - Is it possible to set an individual primitive array element in Java from C++

Basically, I've been doing the following to retrieve Java Instance Fields (in this case, an int) and setting it to a new value like the following: 基本上,我一直在执行以下操作来检索Java实例字段(在本例中为int)并将其设置为新值,如下所示:

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

However, I'd like to do this for an individual int element in a java int array such that: 但是,我想为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?>

Is there such a thing? 有这样的事吗?

I found the answer after looking through 15+ documents. 在查看了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 is key ... it returns a copy back to the java Instance Variable. ReleaseIntArrayElements是关键...它将一个副本返回给java Instance Variable。

If you just want to change only one or few values I highly suggest to use SetIntArrayRegion as it avoids copying back and forth the whole array. 如果你只想改变一个或几个值,我强烈建议使用SetIntArrayRegion因为它避免了来回复制整个数组。

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

for more JNI best practices refer to this article from IBM ;) 有关更多JNI最佳实践,请参阅IBM的这篇文章;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM