一尘不染

通过JNI将C ++类返回Java

java

我目前在一个项目中同时使用C 和Java,并且希望能够将包含在C
中的对象发送到我的Java接口,以便通过GUI对其进行修改,然后将所做的修改发送回C ++中。

到目前为止,我一直没有通过JNI接口向Java返回int或boolean值。这次我必须通过接口发送对象。我已经在C ++和Java中提供了类似的类定义。
我想知道如何创建对象,以便可以在Java中使用它。

在C ++中,我有:

JNIEXPORT MyObject JNICALL Java_ca_X_Y_Z_C_1getMyObject(JNIEnv* env, jclass, jint number);

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

在Java端,我对此方法做了一个简单的调用,

MyObject anObject = C_getMyObject(3);

这应该返回我新创建的对象。

当我进行实际的调用时,Java当前向我返回UnsatisfiedLinkError。怎么了?


阅读 221

收藏
2020-12-03

共1个答案

一尘不染

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

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

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

但是后来我意识到这不是很方便,并且有点太复杂了。

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

(JAVA)
String aString = "valuesoftheobject";
MyObject myObject(aString);

MyObject将有一个采用字符串的构造函数。我相信解决方案简单有效。

2020-12-03