これらのフォーラムを徹底的に検索した後、関連する回答が見つかりませんでした。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++ 静的ライブラリを「そのまま」使用する方法はありますか?
よろしくお願いいたします。
エミエル
編集: その間、有望なものを見つけました: javacpp. このライブラリを使用した経験のある人はいますか?