1

こんにちは : JNA を使用してネイティブ ライブラリの関数にアクセスしたいと考えていました。

1) ネイティブ ライブラリ ファイル (.so ファイルなど) をイントロスペクトして、利用可能なメソッドを確認するにはどうすればよいですか?

2) .so ファイルでアクセス可能なメソッドと、それらのファイルをコンパイルするために構築された C コードとの間に 1 対 1 のマッピングはありますか?

3) JNA は、唯一の Java/ネイティブ相互運用が Java からネイティブ ライブラリを呼び出すことを含むすべてのケースで動作することが保証されていますか (これは JNA の古典的な使用例であると思います)-または代わりに JNI が必要になることがありますか?

4

1 に答える 1

3

1)windows 、、、などのdepends.exe。*nix バリアントで。objdumpnm

2) ほとんどの共有ライブラリは、C スタイルのリンケージ用に設計されています。これは通常、ライブラリ内のシンボルに対応するアドレスを検索できることを意味しますが、型 (変数、定数、または関数) と署名情報 (関数の場合) は通常、ライブラリに埋め込まれていません。

3) JNA はごく少数の一般化された JNI 操作を使用して、共有ライブラリのオープン、シンボルの検索、メモリの読み取り/書き込み、関数の呼び出しなど、すべての魔法を実行します。少なくとも C リンケージを使用するライブラリを扱う場合、JNA よりも JNI を使用しなければならない状況はほとんどありません。

于 2013-01-04T20:01:01.130 に答える