1

これらのフォーラムを徹底的に検索した後、関連する回答が見つかりませんでした。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. このライブラリを使用した経験のある人はいますか?

4

1 に答える 1

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();
}
于 2013-02-22T09:53:18.610 に答える