JNI:将多维java数组传输到c程序
在Java中,定义了非基本对象的多维数组,例如整数[][]arr。如何通过JNI访问C程序中的阵列arrJNI:将多维java数组传输到c程序,java,c,java-native-interface,Java,C,Java Native Interface,在Java中,定义了非基本对象的多维数组,例如整数[][]arr。如何通过JNI访问C程序中的阵列arr 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)->G
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;" );
然后你需要用这个来得到实际的字段。假设您有一个名为fooObj的Foo类型的jobject:
arr可以强制转换到jObjectArray中,您可以使用jni数组函数操纵数组。可以找到文档
由于您有一个整数对象的二维数组,因此必须通过通常的方法从Integer类中获取基元类型。目前,无法直接将一些非基元对象的多维数组从Java程序传输到C程序 这个问题的一个解决方案是制作非原始多维数组的原始版本,并将原始多维数组从Java传输到C。无论如何,这样的多维数组是作为jobjectArray本地传输的 处理整数的二维数组的概述如下: 在Java中制作非原语多维数组的原语版本; 在本机C程序中获取作为jobjectArray的数组; 使用GetObjectArrayElement迭代每一行; 使用GetIntArrayElements函数迭代每个单元格,例如jint*val=*env->GetIntArrayElementsenv,row,NULL;。
INTA[][3]={{0},{1,2},{3,4,5};试试看!!不翻译:通过JNI,我需要从c程序访问java数据。谢谢你,Krsteev。现在,我可以得到每一行的大小,但是我在将jobject强制转换为jint时遇到了问题,例如,2=>22164352。您有一个整数对象的2D数组,它们不是int,您不能将它们强制转换为jint。您必须将数组更改为基元类型,或者通过通常的方法从Integer类中获取基元类型。您说这是不可能的,但随后您将继续演示如何执行此操作。我不明白你的意思。你的意思是说在C语言中不可能将Java多维数组强制转换成连续的数组元素块吗?是的,那是不可能的。我的意思是“直接转移”是不可能的:-是可能的,他们只是工作对象。。。然后,您必须像在Java中一样,使用jni从Integer类中获取int值
jobject arrObj = (*env)->GetObjectField(env, fooObj, field);