[英]How can jvm check arguments and return type when using jni invoking? How to implement this type checking?
JNI規范要求該功能必須放在外部“ C”塊中。 但是C鏈接不包含類型描述符。 因此,當您在Java代碼中調用本機方法時,jvm如何檢查鏈接中的本機代碼的參數編號/順序/類型和返回類型與Java本機定義是否兼容?
而且,我想找出一種實現這種類型檢查的方法。 我已經知道可以在Linux平台上使用dlopen()/dlsym()/dlclose()
,但是它無法獲取類型描述符,因此,我無法進行類型檢查。 還有其他方法可以使用類型描述符加載動態庫和符號嗎?
我將在一個名為JustVM的“ wheel”項目中實現此庫的加載和類型檢查,此處為repo:
https://github.com/lfkdsk/JustVM
JVM不強制本機方法的類型安全。 它只關心名稱。
例如,以下代碼將編譯良好,並且庫將成功加載。 但是,當您調用nativeMethod
,JVM將崩潰,因為它會將返回值-1視為對象。
Test.java
public class Test {
public static void main(String[] args) throws Exception {
System.loadLibrary("test");
new Test().nativeMethod(0, 1);
}
private native Object nativeMethod(long a, int b);
}
測試
#include <jni.h>
JNIEXPORT jint JNICALL Java_Test_nativeMethod(JNIEnv* env, jobject self) {
return -1;
}
如果要保留有關用於動態鏈接的參數類型的信息,則必須以某種方式在函數名稱中對其進行編碼。 請參閱名稱修改 。
JNI規范要求該功能必須放在外部“ C”塊中。 但是C鏈接不包含類型描述符。
但是javah
生成的函數名稱可以。
因此,當您在Java代碼中調用本機方法時,jvm如何檢查鏈接中的本機代碼的參數編號/順序/類型和返回類型與Java本機定義是否兼容?
因為這就是要查找的內容,所以可以根據所需的參數等重新生成名稱,如果找不到則拋出LinkageError
。
而且,我想找出一種實現這種類型檢查的方法。
因此,以相同的方式進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.