在对这些论坛进行彻底搜索之后,无法找到相关答案;我决定问您,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;
}


显然,这将不起作用,因为实现与声明不匹配。所以我的问题可以归结为:

有什么办法可以将J ++ C ++静态库按原样使用?

亲切的问候,感谢您的耐心配合,

艾米尔

编辑:
同时,我发现了一些很有前途的东西:javacpp。这里有人有使用该库的经验吗?

最佳答案

我不确定我是否了解您的系统如何工作,但是可以使用JavaCPP这样的界面进行操作:

@Platform(include="IObject.h",link="DynamicLib")
public class DynamicLib {
    public static class IObject extends Pointer {
        public native void foo();
    }
    public static native IObject CreateObject();
}

08-15 23:59