C ++ JNI互操作性

时间:2013-02-21 22:00:31

标签: android c++ java-native-interface shared-libraries static-libraries

彻底搜索这些论坛后,无法找到相关答案;我决定问你,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;
}
由于实现与声明不匹配,显然不会起作用。所以我的问题归结为:

有没有什么方法可以像JNI一样使用C ++静态库?

亲切的问候,谢谢你的耐心,

Emiel

修改 与此同时,我发现了一些有希望的东西:javacpp。这里有人有使用这个库的经验吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解您的系统是如何工作的,但是这个界面应该适用于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();
}