簡體   English   中英

使用jni調用時,jvm如何檢查參數和返回類型? 如何實現這種類型檢查?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM