在 Java 中,定义了一个非原始对象的多维数组,例如Integer[][] arr
。如何arr
通过 JNI 访问 C 程序中的数组?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
在 Java 中,定义了一个非原始对象的多维数组,例如Integer[][] arr
。如何arr
通过 JNI 访问 C 程序中的数组?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
首先,获取字段ID:
jclass clazz = (*env)->FindClass(env, "fully/qualified/package/Foo");
jfieldID field = (*env)->GetFieldID(env, clazz, "arr", "[[Ljava/lang/Integer;" );
然后您需要使用它来获取实际字段。假设你有一个jobject
类型Foo
叫做fooObj
:
jobject arrObj = (*env)->GetObjectField(env, fooObj, field);
arr
可以转换为 a jObjectArray
,您可以使用 jni 数组函数来操作数组。文档可以在这里找到。
由于您有一个 Integer 对象的二维数组,因此您必须通过通常的方法从 Integer 类中获取原始类型。
目前,将一些非原始对象的多维数组从Java程序直接传递给C程序是不可能的。
解决这个问题的方法是制作非原始多维数组的原始版本,并将原始多维数组从 Java 传输到 C。无论如何,这样的多维数组是作为jobjectArray
本地传输的。
处理二维整数数组的概要如下:
jobjectArray
;GetObjectArrayElement
迭代每一行;GetIntArrayElements
函数来迭代每个单元格,例如jint *val = (*env)->GetIntArrayElements(env, row, NULL);
.