Как получить доступ к массивам внутри объекта с помощью JNI?

JNI учебники, напримерэт one, достаточно подробно рассказывает, как получить доступ к примитивным полям в объекте, а также как получить доступ к массивам, которые предоставляются в качестве явных аргументов функции (то есть в качестве подклассовjarray). Но как получить доступ к Java (примитивным) массивам, которые являются полями anjobject? Например, я хотел бы работать с байтовым массивом следующего объекта Java:

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

Основная программа может выглядеть примерно так:

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);
}

Соответствующая сторона C ++ будет:

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???
}

Я думал использоватьGetByteArrayElements, но он хочетArrayType в качестве аргумента. Очевидно, я что-то упустил. Есть ли способ к этому?

Ответы на вопрос(2)

Ваш ответ на вопрос