我們知道下面的通話談話的主題, What's the calling convention for the Java code in Linux platform? 並且還解釋說,哪些寄存器用於在solaris/linux中爲JNI方法傳遞JNIEnv?
「你可能會注意到的Java調用約定類似於C調用約定,而是由一個說法正確的,這是有意這樣做的移調用JNI方法時避免額外的寄存器混洗(您知道,JNI方法在方法參數前面有額外的JNIEnv *參數)。「所以當我們調用JNI函數,如jclass FindClass(JNIEnv * env,const char * name)時,這意味着什麼?那麼JNIEnv值env將被傳遞給rdi,並將名稱傳遞給rsi,但是當我們調用諸如void printClassName(int Integer1,Object obj)之類的通用非JNI Java方法時,則Integer1被傳遞給rsi,而obj被傳遞傳遞給堆棧,因爲它不是一個整數,它是正確的?
如果我錯了,請糾正我。
|-------------------------------------------------------|
| 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 |
|-------------------------------------------------------|
您試圖解決什麼問題? –
研究調試知識。 –