JNIを介してアクセスしたいネイティブ関数宣言があり、すべてのクラス宣言を保持するDLLがあります。
完全なヘッダーファイルとその依存関係はありませんが、すべての情報を保持するDLLはあります。
DLLと関数宣言だけでSWIGを使用してJNIインターフェースを作成することは可能ですか?
参照:SWIGCYGWINDLLリンク。これは非常によく似た問題です。
JNIを介してアクセスしたいネイティブ関数宣言があり、すべてのクラス宣言を保持するDLLがあります。
完全なヘッダーファイルとその依存関係はありませんが、すべての情報を保持するDLLはあります。
DLLと関数宣言だけでSWIGを使用してJNIインターフェースを作成することは可能ですか?
参照:SWIGCYGWINDLLリンク。これは非常によく似た問題です。
(おそらく部分的な)ヘッダーファイルを再構築できるようにDLLから十分な情報を推測できない限り、これを行うことはできません。
気になる関数(すべてである必要はありません)と気になるタイプ(すべてである必要はありませんが、すべての関数の名前を知っている必要があります)に関する情報が含まれている必要があります。
これで、通常どおりモジュールファイルを作成できます。C ++かCかによって、その情報の一部を推測/推測できます。C++の場合、マングルされた名前は、入力について知っておく必要のあるほとんどの情報を示しますが、戻り値の型は示しません。
例として、私はコンパイルしました:
class foo {};
foo *make_foo() { return new foo; }
void eat_foo(foo*) {}
void frobinate_two_foos(foo*,foo*) {}
使用するDLLとして:
i586-mingw32msvc-g ++ -shared -Wall -Wextra original.cc -o test.dll
それから、次のようにしてDLL内のシンボルを確認できます。
i586-mingw32msvc-nm test.dll | i586-mingw32msvc-c ++ filt
興味深いものは次のとおりです。
6bec1286 T frobinate_two_foos(foo *、foo *) 6bec1280 T eat_foo(foo *) 6bec128c T make_foo()
したがって、これらをラップするSWIGモジュールは次のようになります。
%module reversed
class foo; // Nothing more known
foo *make_foo();
void frobinate_two_foos(foo*,foo*); // Return type guessed
// ignored eat_foo, I don't know what that does at all!
ただし、生成されたラッパーをコンパイルできるように、十分なヘッダーを作成する必要があります。