2013-02-21 218 views
1

经过这些论坛的彻底搜索,并无法找到相关的答案;我决定问你,我的问题StackOverflow友善的人。C++ JNI互操作性

我现在有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?

亲切的问候,并感谢您对您的耐心,

Emiel

编辑: 在此期间,我已经发现了一些有前途的:javacpp。有没有人有使用这个库的经验?

+0

你们是不是要调用由C++的Java或C++与Java? – Eric 2013-02-21 23:28:00

+0

我不知道它是否会帮助你,但我做了一个关于使用jni的教程。 http://julien-dumortier.fr/android-ndk-faire-du-c-avec-android/ 请原谅我的英语。也许我不明白这个问题! – 2013-02-22 00:16:57

+0

我正试图从Java调用C++。 – user2097260 2013-02-22 00:52:31

回答

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(); 
}