Учебники JNI, например этот, достаточно хорошо описывают, как обращаться к примитивным полям внутри объекта, а также как обращаться к массивам, которые предоставляются как явные аргументы функции (т.е. как подклассы jarray
). Но как получить доступ к массивам Java (примитивных), которые являются полями в jobject
? Например, я хотел бы работать с массивом байтов следующего объекта 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);
}
Соответствующая сторона С++ будет:
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 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
в качестве аргумента. Очевидно, что я что-то упускаю. Есть ли способ сделать это?