JNI:将多维java数组传输到c程序

JNI:将多维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

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