2010-09-09 9 views
6

Zasadniczo wykonałem następujące czynności, aby pobrać pola instancji Java (w tym przypadku int) i ustawić je na nową wartość, na przykład następujące:Java JNI - Czy jest możliwe ustawienie pojedynczego prymitywnego elementu tablicy w języku Java z C++

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

jednak chciałbym to zrobić dla pojedynczego elementu int w java int tablica taka, że:

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

Czy istnieje coś takiego?

Odpowiedz

7

Znalazłem odpowiedź po przejrzeniu ponad 15 dokumentów.

// 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 jest kluczem ... zwraca kopię z powrotem do zmiennej instancji Java.

+2

I uwalnia pamięć przydzieloną przez GetIntArrayElements(). – EJP

+0

Używanie 'GetIntArrayElements' do uzyskiwania dostępu tylko do jednego elementu jest odpadem. Zamiast tego użyj 'SetIntArrayRegion'. – Sdra

2

Jeśli chcesz zmienić tylko jedną lub kilka wartości, bardzo polecam używać SetIntArrayRegion, ponieważ unika to kopiowania całej tablicy.

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

wiecej JNI najlepszych praktyk dotyczą this artykułu z IBM;)

Powiązane problemy