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

时间:2015-01-28 16:20:39

标签: java c++ arrays java-native-interface data-conversion

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

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

class CplusplusExampleClass {
public:
    int variable;
};

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

public class JavaExampleClass {
    public int variable;
}

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

这可能,然后,我该怎么做?

1 个答案:

答案 0 :(得分:1)

这不是你想要的吗? 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, ...);

另外,你应该对所有这些的返回值进行空值检查。

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

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