通过JNI将C++类返回给Java

tom*_*mzx 14 c++ java java-native-interface struct class

我目前正在项目中使用C++和Java,并且我希望能够将包含在C++中的对象发送到我的Java接口,以便通过GUI修改它,然后用C++发回修改.

到目前为止,我已经通过JNI接口向Java返回任何内容,int或布尔值.这次我必须通过界面发送一个对象.我在C++和Java中都提供了类似的类定义.我想知道如何创建对象,以便我可以在Java中使用它.

在C++中我有:

JNIEXPORT MyObject JNICALL Java_ca_X_Y_Z_C_1getMyObject(JNIEnv* env, jclass, jint number);
Run Code Online (Sandbox Code Playgroud)

Java将调用此函数以便从C++端获取对象(该对象包含在单例中,易于访问).

在Java端,我只是简单地调用这个方法,

MyObject anObject = C_getMyObject(3);
Run Code Online (Sandbox Code Playgroud)

哪个应该返回我新创建的对象.

当我进行实际调用时,Java当前返回一个UnsatisfiedLinkError.怎么了?

tom*_*mzx 11

这是我选择使用的解决方案:

首先,我将在Java中创建一个类似的对象.然后,从C++我将实例化并传递所有值.

(C++)
clazz = env->FindClass("java/lang/Integer");
jmethodID method = env->GetMethodID(clazz, "<init>", "(I)V");
return env->NewObject(clazz, method, (jint)anInteger);
Run Code Online (Sandbox Code Playgroud)

但后来我意识到这不是很便携,而且有点太复杂了.

相反,我决定返回一个Java将解析并用于初始化对象的字符串.

(JAVA)
String aString = "valuesoftheobject";
MyObject myObject(aString);
Run Code Online (Sandbox Code Playgroud)

MyObject将有一个构造函数,它接受一个字符串.我相信解决方案简单有效.


Art*_*rke 5

你应该看的另一个工具是SWIG.SWIG是一个很好的工具,可以为现有的C/C++对象生成其他语言(如Java,Python或C#)的包装器.它将围绕C/C++对象生成自动Java包装器,并为您完成所有繁重的JNI提升.

我在Xuggler中广泛使用它.要查看示例,如果您下载Xuggler源代码,则此处有一个C++对象:

csrc/com/xuggle/xuggler/IStreamCoder.h
Run Code Online (Sandbox Code Playgroud)

我在这里定义一个SWIG接口文件:

csrc/com/xuggle/xuggler/IStreamCoder.i
Run Code Online (Sandbox Code Playgroud)

当通过Swig运行时,它会生成一个Java对象(存储在这里)

generate/java/com/xuggle/xuggler/IStreamCoder.java
Run Code Online (Sandbox Code Playgroud)

然后我们可以轻松地从Java访问该对象(好吧,我添加一些引用计数的东西,但这非常先进).希望有所帮助.

艺术