7

新しい共有ライブラリを動的にロードするためのCコード(Linuxでのみ機能する場合は問題ありません)を記述し、そこからメソッドを呼び出します(実行時に決定されます)。Javaはネイティブライブラリを動的にロードし、そこからメソッドを呼び出すことができるため、これはすでに可能であるようです。

たとえば、次のようなことをしたいと思います。

int main() {
    libinfo_t * lib_details = load_shared_library("libfoo.so");
    run_method(lib_details, "bar", 7);
}

これにより、引数7を指定してメソッド'bar'が呼び出されます(barはlibfoo.soにコンパイルされたメソッドです)。

ユースケースの詳細:

元のプログラムのメモリコンテキストで、ディレクトリ内のすべての共有ライブラリをロードし、それぞれからいくつかのメソッドを実行するバイナリをコンパイルしたいと思います。共有ライブラリをディレクトリに追加/削除することで、共有ライブラリをすばやく有効または無効にできるようにしたいと思います。

コンセプトの証明:

javaがjniコードと動的にリンクする方法に基づいて、これは可能であると思われます。System.load()を使用して、選択したライブラリをロードできます。メモリからのコンパイルと相まって、任意のライブラリから任意の関数を実行できるようになります。http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

私が試したこと:

  1. 'uselib'のマンページを見ましたが、これは便利なようですが、ライブラリをロードした後はどうすればよいかわかりません。

  2. 少しグーグルでhttp://dyncall.org/が返されましたが、これは私が必要としているものではありません。このプロジェクトでは、関数呼び出しを行うために関数ポインターが必要です。

具体的な答えがなくても、次にどこを見ればよいかを教えていただければ幸いです。ありがとう!

4

1 に答える 1

9

Linux には、このための非常に完全な API があります。それがdlopen(3)APIです。

まず、dlopenファイル名を指定して呼び出し、共有ライブラリ ハンドルを取得します。

void* lib = dlopen("./lib.so");

このライブラリ内の関数の関数ポインタを取得するには、次のようにします。

int (*func)() = dlsym(lib, "thing");

このポインタは自由に使用してください。

最後に、完了したら:

dlclose(lib)

注: エラー チェックを忘れずに行ってください。

于 2013-02-19T03:49:11.127 に答える