Java JNI - возможно ли установить отдельный элемент массива в Java из C ++ - PullRequest
7 голосов
/ 09 сентября 2010

По сути, я делал следующее, чтобы получить поля экземпляра Java (в данном случае int) и установить для него новое значение, например:

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

Однако яхотел бы сделать это для отдельного элемента int в массиве Java Java, например:

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

Есть ли такая вещь?

Ответы [ 2 ]

8 голосов
/ 09 сентября 2010

Я нашел ответ после просмотра более 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 является ключевым ... он возвращает копию обратно в переменную экземпляра Java.

4 голосов
/ 13 ноября 2013

Если вы просто хотите изменить только одно или несколько значений, я настоятельно рекомендую использовать SetIntArrayRegion, так как это позволяет избежать копирования вперед и назад всего массива.

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

, чтобы узнать больше рекомендаций JNI, обратитесь к этой статье от IBM;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...