Wie greife ich mit JNI auf Arrays innerhalb eines Objekts zu?

Zum Beispiel JNI-Tutorialsdiese Erstens, beschreiben Sie recht gut, wie auf primitive Felder innerhalb eines Objekts zugegriffen werden kann und wie auf Arrays zugegriffen werden kann, die als explizite Funktionsargumente (d. h. als Unterklassen vonjarray). Aber wie man auf Java (primitive) Arrays zugreift, die Felder sindinnerhalb einjobject? Zum Beispiel möchte ich das Byte-Array des folgenden Java-Objekts bearbeiten:

class JavaClass {
  ...
  int i;
  byte[] a;
}

Das Hauptprogramm könnte etwa so aussehen:

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 zu benutzenGetByteArrayElements, aber es will einArrayType als Argument. Offensichtlich fehlt mir etwas. Gibt es einen Weg dorthin?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage