JNI-Tutorials, zum Beispiel this eine, decken ziemlich gut, wie primitive Felder innerhalb eines Objekts zugreifen, sowie wie auf Arrays zugreifen, die als explizite Funktionsargumente (d. H. Als Unterklassen von jarray
) bereitgestellt werden. Aber wie auf Java (primitive) Arrays zugreifen, die Felder sind innerhalb ein jobject
? Zum Beispiel würde Ich mag auf dem Byte-Array des folgenden Java-Objekts betreiben:Wie kann mit JNI auf Arrays innerhalb eines Objekts zugegriffen werden?
class JavaClass {
...
int i;
byte[] a;
}
Das Hauptprogramm so etwas wie dies sein könnte:
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);
}
Die entsprechende C++ Seite wäre dann:
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???
}
ich dachte GetByteArrayElements
zu verwenden, aber es ein ArrayType
als Argument will. Offensichtlich vermisse ich etwas. Gibt es einen Weg dazu?
Dank; es ist clever (und vielleicht sogar sauberer), Getter zu verwenden. Ich muss es auf diese Weise tun, es sei denn, jemand zeigt auf, wie man die Array-Felder in GetXXXField-ähnlicher Weise direkt erhält. –
Ok Ich habe ein Beispiel für das Feld hinzugefügt (benutze im Prinzip nur GetObjectField anstelle von CallObjectMethod). Obwohl ich natürlich nicht garantieren kann, dass es aus der Box läuft, hoffe ich, dass Sie die allgemeine Idee bekommen können :) – Daff
Richtig! Irgendwie rechnete ich damit, etwas einfacher zu finden und daher zögerte ich, zu Definitionen zurückzukehren ("Array ist ein Objekt") :-) Programmierpsychologie ... Danke nochmal! –