Samouczki JNI, na przykład this jeden, obejmują całkiem dobrze, jak uzyskać dostęp do prymitywnych pól w obiekcie, a także jak uzyskać dostęp do tablic, które są dostarczane jako jawne argumenty funkcji (tj. Jako podklasy jarray
). Ale jak uzyskać dostęp do tablic Java (prymitywnych), które są polami w ramach an jobject
? Na przykład, chciałbym pracować na tablicy bajtów następującego obiektu Java:Jak uzyskać dostęp do tablic wewnątrz obiektu za pomocą JNI?
class JavaClass {
...
int i;
byte[] a;
}
Program główny może być coś takiego:
class Test {
public static void main(String[] args) {
JavaClass jc = new JavaClass();
jc.a = new byte[100];
...
process(jc);
}
public static native void process(JavaClass jc);
}
Odpowiedni C++ strona będzie wówczas:
JNIEXPORT void JNICALL Java_Test_process(JNIEnv * env, jclass c, jobject jc) {
jclass jcClass = env->GetObjectClass(jc);
jfieldID iId = env->GetFieldID(jcClass, "i", "I");
// This way we can get and set the "i" field. Let's double it:
jint i = env->GetIntField(jc, iId);
env->SetIntField(jc, iId, i * 2);
// The jfieldID of the "a" field (byte array) can be got like this:
jfieldID aId = env->GetFieldID(jcClass, "a", "[B");
// But how do we operate on the array???
}
Myślałam użyć GetByteArrayElements
, ale chce się ArrayType
jako argument. Oczywiście, że czegoś brakuje. Czy jest na to sposób?
Dzięki; jest to sprytne (a może nawet czystsze) użycie getterów. Będę musiał to zrobić w ten sposób, chyba że ktoś wskaże, jak uzyskać bezpośrednio pola tablicy, w stylu GetXXXField. –
OK Dodałem przykład dla pola (w zasadzie po prostu użyj GetObjectField zamiast CallObjectMethod). Choć oczywiście nie mogę zagwarantować, że zabraknie go w pudełku, mam nadzieję, że uzyskasz ogólny pomysł :) – Daff
Dobrze! Jakoś oczekiwałem, że znajdę nieco prostszy sposób, aby to zrobić, więc nie chciałem wracać do definicji ("array is an object" :-) Programowanie psychologii ... Jeszcze raz dziękuję! –