在Java中,非原始对象的多维数组,例如, Integer[][] arr
已定义。如何通过JNI访问C程序中的数组arr
?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
答案 0 :(得分:8)
首先,获取字段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
可以转换为jObjectArray
,您可以使用jni数组函数操作数组。可以找到文档here。
由于你有一个Integer对象的2D数组,你必须通过常用方法从Integer类中获取原始类型。
答案 1 :(得分:1)
目前,不可能将一些非原始对象的多维数组从Java程序直接传输到C程序。
这个问题的解决方案是制作非原始多维数组的原始版本,并将原始多维数组从Java传输到C.无论如何,这样的多维数组被转换为jobjectArray
原生。
处理二维整数数组的概要如下:
jobjectArray
; GetObjectArrayElement
迭代每个行; GetIntArrayElements
函数迭代每个单元格,例如jint *val = (*env)->GetIntArrayElements(env, row, NULL);
。