如何调用从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);
我正在创建一个 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);