2010-09-09 13 views
6

Básicamente, he estado haciendo lo siguiente para recuperar los campos de instancia de Java (en este caso, un int) y establecerlo en un nuevo valor como lo siguiente:Java JNI - ¿Es posible establecer un elemento de matriz primitiva individual en Java desde C++

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

Sin embargo, me gustaría hacer esto para un elemento individual en un int int matriz java tal que:

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

¿existe tal cosa?

Respuesta

7

Encontré la respuesta después de consultar más de 15 documentos.

// 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 es la clave ... devuelve una copia a la variable de instancia de java.

+2

y libera la memoria asignada por GetIntArrayElements(). – EJP

+0

El uso de 'GetIntArrayElements' para acceder a un solo elemento es un desperdicio. Use 'SetIntArrayRegion' en su lugar. – Sdra

2

Si solo desea cambiar solo uno o pocos valores, le sugiero que use SetIntArrayRegion ya que evita copiar y volver la matriz de todos.

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

para más mejores prácticas JNI se refieren a this artículo de IBM;)

Cuestiones relacionadas