如何调用从JNI返回数组的C++方法,并将数组的内容转换为java类的数组?

How to call a C++ method returning an array from JNI and convert the contents of the array to an array of java classes?

我正在创建一个 C++ 库,我想将它移植到 java。我有一个通过调用 GetRawInputDeviceList() 获取 RAWINPUTDEVICELIST 的方法,然后滚动数组并将每个项目转换为一个名为 Device 的 class 的实例,并将它们添加到一个数组,在 C++ 中。我想调用此方法并将列表的内容转换为 java classes 的数组,称为 Device 之类的东西,并将其包含的变量分配给C++ class.

编辑: 假设我要转换的数组包含 C++ class 的实例,如下所示:

class CplusplusExampleClass {
public:
    int variable;
};

我想将 C++ 数组中包含的 class 的所有实例转换为 java class 的相应实例。假设 java class 看起来像这样:

public class JavaExampleClass {
    public int variable;
}

这可能与@Gergely 建议的问题的答案中描述的方法有关,只需转换整数,然后为每个 class 创建一个新实例,但假装 classes 包含很多东西,比如对象(class 实例)、其他变量等。

这可以吗,然后,我该怎么做?

这不正是你所追求的吗? How to return an array from JNI to Java?

这里有一些更详细的例子:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-6.2

如果您想从 JNI 代码创建 Java 对象,那会特别痛苦。像这样:

jclass cls = (*env)->FindClass(env, "...your class...");
jmethodID ctor = (*env)->GetMethodID(env, cls, "<init>", "...your ctor signature...");
jobject obj = (*env)->NewObject(env, cls, ctor, ...);

此外,您当然应该对所有这些的 return 值进行空检查。

之后您可以创建 Java 数组并将项目添加到其中:

jobjectArray results = (*env)->NewObjectArray(env, 100, cls, NULL);
(*env)->SetObjectArrayElement(env, results, 0, obj);