2

JNIを介してアクセスしたいネイティブ関数宣言があり、すべてのクラス宣言を保持するDLLがあります。

完全なヘッダーファイルとその依存関係はありませんが、すべての情報を保持するDLLはあります。

DLLと関数宣言だけでSWIGを使用してJNIインターフェースを作成することは可能ですか?

参照:SWIGCYGWINDLLリンク。これは非常によく似た問題です。

4

1 に答える 1

1

(おそらく部分的な)ヘッダーファイルを再構築できるように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!

ただし、生成されたラッパーをコンパイルできるように、十分なヘッダーを作成する必要があります。

于 2012-05-10T10:11:47.570 に答える