彼らはMonoのPInvokeのようなものを使用していますか?それとも、ランタイムが開始される前に登録された内部呼び出しのようなものですか?javaには、mscorlib.dllのようなネイティブ呼び出しを処理するためのベースライブラリがありますか?CコードでJVMを呼び出したい場合、ライブラリは.so / .dllファイルを検索しますか?すべてのJREネイティブライブラリを静的にリンクすると、Java標準ライブラリに違いがありますか?
4 に答える
彼らは、公に文書化されているとおりにJNIを使用して、特定のプラットフォーム用のネイティブ共有ライブラリを呼び出します。
CコードからJVMを呼び出す限り、JVMは共有ライブラリ(DLL、SOなど)を使用します。JDK 6のソースコードをすばやく検索しても、コアネイティブサポート(Object、Stringなどのネイティブメソッドなど)のSystem.loadLibrary()は見つかりません。これは、JRE / binディレクトリの内容から判断してDLLにあるように見えるこれらのメソッドのネイティブコードが、java.exe(およびWindowsのjavaw.exe)によって明示的にリンクされていることを示しています。
私が最後にこのようなものを見たとき、CコードからJVMを呼び出すための要件は、JNIの十分に文書化された部分でした。さらに先に進むには、そのドコを参照することを強くお勧めします。IBM AS / 400 Java1.1JVM用のネイティブCラッパー/ローダーの作成にも成功しました。
それらはJavaNativeInterface(JNI)を使用します。
CからJVMを呼び出したことがないので、それについてはわかりません。
Cプログラム内からJVMを起動する方法の例を次に示します。
「JavaNativeAccess(JNA)は、Javaコード以外に何も記述せずに、Javaプログラムがネイティブ共有ライブラリ(Windows上のDLL)に簡単にアクセスできるようにします」(ホームページからの引用)。
個人的にはこれまで試したことはありません。