JNI:将多维java数组传递给c程序

时间:2013-10-10 19:25:43

标签: java c java-native-interface

在Java中,非原始对象的多维数组,例如, Integer[][] arr已定义。如何通过JNI访问C程序中的数组arr

public class Foo {
    public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}

2 个答案:

答案 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原生。

处理二维整数数组的概要如下:

  1. 在Java中创建非原始多维数组的原始版本;
  2. 在本机C程序中将数组作为jobjectArray;
  3. 使用GetObjectArrayElement迭代每个;
  4. 使用GetIntArrayElements函数迭代每个单元格,例如jint *val = (*env)->GetIntArrayElements(env, row, NULL);