2017-02-18 13 views
0

私たちは、このスレッドも What's the calling convention for the Java code in Linux platform? そしてそれはsolaris/linuxでJNIメソッドのJNIEnvを渡すために使用されたレジスタは?

は、「あなたはJavaの呼び出し規約がC呼び出し規則に似ていることに気づくことが説明したが、右。これはに意図的に行われている1つの引数でシフトし、次の呼び出し会話を知っていますJNIメソッドを呼び出すときに余分なレジスタのシャッフルを避けてください(JNIメソッドはメソッドのパラメータの前に余分なJNIEnv *引数を持っています)。

これは、jclass FindClass(JNIEnv * env、const char * name)などのJNI関数を呼び出したときの意味です。 JNIEnvの値envがrdiに渡され、名前がrsiに渡されますが、void printClassName(int Integer1、Object obj)など一般的な非JNI Javaメソッドを呼び出すと、Integer1がrsiに渡され、objがIntegerではないのでスタックに渡されますが、それは正しいでしょうか?

私が間違っている場合は私を修正してください。

|-------------------------------------------------------| 
| c_rarg0 c_rarg1 c_rarg2 c_rarg3 c_rarg4 c_rarg5 | 
|-------------------------------------------------------| 
| rcx  rdx  r8  r9  rdi* rsi*  | windows (* not a c_rarg) 
| rdi  rsi  rdx  rcx  r8  r9   | solaris/linux 
|-------------------------------------------------------| 
| j_rarg5 j_rarg0 j_rarg1 j_rarg2 j_rarg3 j_rarg4 | 
|-------------------------------------------------------| 
+0

あなたが解決しようとしている問題は何ですか? –

+1

デバッグの知識を調べる。 –

答えて

0

与えられたテーブルには、VMがのJavaメソッドを呼び出す方法を説明します。

など。それはRCX (j_rarg2)RDX (j_rarg1)

  • oRSI (j_rarg0)
  • i

    • thisを渡しvoid print(int i, Object o) Javaメソッドを呼び出すとき - オブジェクト参照も、汎用レジスタに渡されます。

    メソッドがnativeと宣言されているかどうかにかかわらず、呼び出し規約は同じです。ネイティブメソッドのためにそこにネイティブ実装されます

    void Java_ClassName_print(JNIEnv* env, jobject this, jint i, jobject o); 
    

    このネイティブ関数は、標準platform ABIを次の、つまり、

    • envRDX (c_rarg2)RSI (c_rarg1)
    • iRDI (c_rarg0)
    • thisに行きます
    • oによるj_rargsc_rargsの賢明な選択に、パラメータが同じレジスタに残っていることを注意

    RCX (c_rarg3)へ。


    FindClassのようなJNI関数は、VM呼び出し規約とは関係ありません。それらはプラットフォームABIに従わなければなりません。したがって、最初の引数JNIEnv*はLinux/x64のRDIに渡されます。

  • +0

    非常に分かりやすい説明をいただき、とても親切です。しかし、これまで述べてきたように、「最大6つの整数引数がレジスタに渡されます:rsi、rdx、rcx、r8、r9、rdi」(http://stackoverflow.com/questions/41693637/whats-the-calling-convention) Object-for-Java-Code-in-Linuxプラットフォームでは、オブジェクト参照は整数ではなく、RCXで渡されたのはなぜですか? openjdkの記事は、あなたが6つの整数を言っているのと同じ意味を表しています... https://wiki.openjdk.java.net/display/HotSpot/CallingSequences、私は何か誤解があると思います。 –

    +0

    @Jacky上記の引用符では、 "浮動小数点"とは逆の "整数"を使用しました。オブジェクト参照(アドレス/ポインタ/圧縮ポインタなど)は、汎用(整数)レジスタに適合する値でもあります。 – apangin

    +0

    あなたの優れた説明には大変感謝しています。 –

    関連する問題