2013-02-21 231 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(); 
}