0

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

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

2 回答 2

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可以转换为 a jObjectArray,您可以使用 jni 数组函数来操作数组。文档可以在这里找到。

由于您有一个 Integer 对象的二维数组,因此您必须通过通常的方法从 Integer 类中获取原始类型。

于 2013-10-10T21:11:01.153 回答
1

目前,将一些非原始对象的多维数组从Java程序直接传递给C程序是不可能的。

解决这个问题的方法是制作非原始多维数组的原始版本,并将原始多维数组从 Java 传输到 C。无论如何,这样的多维数组是作为jobjectArray本地传输的。

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

  1. 在 Java 中制作非原始多维数组的原始版本;
  2. 获取本机 C 程序中的数组jobjectArray
  3. 用于GetObjectArrayElement迭代每一
  4. 使用GetIntArrayElements函数来迭代每个单元格,例如jint *val = (*env)->GetIntArrayElements(env, row, NULL);.
于 2013-10-11T17:18:09.683 回答