经过对这些论坛的彻底搜索,无法找到相关答案;我决定问你,StackOverflow 的好心人我的问题。
我目前有 3 个(C++)库:
StaticLib(包含纯虚拟接口和“C”风格原型)
DynamicLibLinux(包含上述原型的 Linux 实现)
DynamicLibAndroid(不知道在这里放什么)
问题是,我不想更改 StaticLib 的代码,即:
struct IObject {
virtual ~IObject() {}
virtual void foo() = 0;
};
extern "C" {
IObject* CreateObject();
}
DynamicLibLinux 包含
#include <IObject.h>
class Object : public IObject {
public:
virtual ~Object() {}
virtual void foo() {
//do something incredibly useful here...
}
};
#ifdef __cplusplus
extern "C" {
#endif
IObject* CreateObject() {
return new Object;
}
#ifdef __cplusplus
}
#endif
之后,在我的 linux 独立版中,我可以调用 dlsym("libDynamicLibLinux.so") 函数来加载我的 CreateObject 函数。这一切都像一个魅力。现在,事情是这样的:我也想在 Android 应用程序中使用静态库。而且我不知道如何在 JNI 中实现这一点。到目前为止,我有这样的事情:
#include <IObject.h>
#include <jni.h>
class Object : public IObject {
... same as above
};
#ifdef ...
JNIEXPORT IObject* JNICALL CreateObject(JNIEnv*) {
return new Object;
}
显然,这将不起作用,因为实现与声明不匹配。所以我的问题归结为:
有什么办法可以将 C++ 静态库“按原样”与 JNI 一起使用?
亲切的问候,感谢您的耐心等待,
埃米尔
编辑: 与此同时,我发现了一些有希望的东西:javacpp。这里有人有使用这个库的经验吗?