2010-09-09 14 views
6

Fondamentalement, j'ai fait ce qui suit pour récupérer des champs d'instance Java (dans ce cas, un int) et le définir à une nouvelle valeur comme les éléments suivants:Java JNI - Est-il possible de définir un élément de tableau primitif individuel en Java à partir de C++?

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

Cependant, je voudrais faire cela pour un élément int individuel dans un tableau int java tel que:

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

y at-il une telle chose?

Répondre

7

J'ai trouvé la réponse après avoir consulté plus de 15 documents.

// 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 est la clé ... il renvoie une copie de sauvegarde à la variable d'instance de java.

+2

ET elle libère la mémoire allouée par GetIntArrayElements(). – EJP

+0

L'utilisation de 'GetIntArrayElements' pour accéder à un seul élément est une perte. Utilisez 'SetIntArrayRegion' à la place. – Sdra

2

Si vous voulez juste changer seulement une ou quelques valeurs, je suggère fortement d'utiliser SetIntArrayRegion car il évite de copier dans tous les sens.

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

pour plus de meilleures pratiques JNI se réfèrent à l'article this d'IBM;)