Jak uzyskać dostęp do tablic w obiekcie za pomocą JNI?

Na przykład tutoriale JNIto jeden, pokrywa się całkiem dobrze, jak uzyskać dostęp do pierwotnych pól w obiekcie, a także jak uzyskać dostęp do tablic, które są dostarczane jako jawne argumenty funkcji (tj. jako podklasyjarray). Ale jak uzyskać dostęp do tablic Java (prymitywnych), które są polamiw ciągu najobject? Na przykład chciałbym operować w tablicy bajtów następującego obiektu Java:

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

Głównym programem 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);
}

Odpowiednia strona C ++ byłaby wtedy:

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łem o użyciuGetByteArrayElements, ale chceArrayType jako jego argument. Oczywiście coś mi brakuje. Czy istnieje sposób na to?

questionAnswers(2)

yourAnswerToTheQuestion