2017-06-07 17 views
0

Cで定義されたメソッドがJavaから呼び出されるとき(JNIを使​​用)、JVM内で呼び出されるメソッドは何ですか?実行フローはどのように見えますか?JNIでJVM関数と呼ばれる内部で

  1. つまり、方法を検討してくださいpublic native void display()。このメソッドをjavaコードからobject.display()という名前で呼び出すと、ネイティブコードの実行が進むにつれて呼び出される内部JVMメソッドは何ですか?
  2. これに関する詳細はどこにありますか?あるいは、ソースのどのJVM機能を見たりトレースしたりすることができますか?
+0

がネイティブメソッドを呼び出すには、HotSpotのJVMランタイムスタブ(VMの起動時に生成されたマシンコードのフラグメント)に入り、 。このランタイムスタブは、必要なJNIのすべての処理を行います。手順は[ここ](https://stackoverflow.com/a/24747484/3448419)で説明しています。 – apangin

+0

インタプリタからネイティブメソッドを呼び出すソースは、['InterpreterGenerator :: generate_native_entry'](http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/4d9931ebf861/src/cpu/x86/vm/)にあります。 templateInterpreter_x86_64.cpp#l960)、または['SharedRuntime :: generate_native_wrapper'](http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/4d9931ebf861/src/cpu/x86/vm/sharedRuntime_x86_64.cpp #l1723)JITコンパイルされたコードからネイティブメソッドを呼び出すためのものです。 – apangin

+0

上記はHotSpot JVMに当てはまります。他のJVMはこれを別々に行うかもしれません。 – apangin

答えて

1

実行の正確なチェーンを見たい場合は、gdb(またはCLion)を使用してJVMに接続し、バックトレースを参照することをお勧めします。

それを行う方法を見るにはこちらをご覧ください:

http://www.owsiak.org/?p=2095

あなたがここにも見てとることができます。

https://www.youtube.com/watch?v=8Cjeq4l5COU

をあなたはあなたができる、JVMに接続されるとあなたのCコードにブレークポイントを設定し、バックトレースを上から下にチェックしてください。

また、あなたはSIGSEGVを作成して、JVMのフルバックトレースを生成することができます(ここで見てみましょう:http://jnicookbook.owsiak.org/recipe-No-015/)は

関連する問題