java JNI 實現原理 (三) JNI中的RegisterNatives方法 -开发者知识库

java JNI 實現原理 (三) JNI中的RegisterNatives方法 -开发者知识库,第1张

我們常用javah去生成JNI的頭文件,然后去實現自己定義的JNI方法,使用這種方式比較傳統,我們可以看到定義的格式甚至連名字都必須按照規范

JNIEXPORT jint JNICALL Java_test_symlink
(JNIEnv *, jobject, jstring, jstring);

完整的結構是Java_classpath_classname_native method name,這樣才能當jvm運行的時候根據這個命名規則去找到對應的native的方法。

實際上jvm也同時提供了直接RegisterNative方法手動的注冊native方法

下面是一個代碼的例子

static JNINativeMethod methods[] = {
{"retrieveDirectives", "()Ljava/lang/AssertionStatusDirectives;", (void *)&JVM_AssertionStatusDirectives}
};


(*env)->RegisterNatives(env, cls, methods,
sizeof(methods)/sizeof(JNINativeMethod));


RegisterNative 函數中的參數 

RegisterNative(JNIEnv, jclass cls, JNINativeMethod *methods,  jint number)

1. methods 是一個二維數組,代表着這個class里的每一個native方法所對應的實現的方法,在前面的例子中表示,一個native 方法retrieveDiretives, 返回值為AssertionStatusDirectives, 所對應的執行的本地方法是JVM_AssertionStatusDirectives

2. 后面的number 代表要指定的native的數量


RegisterNative的實現

RegisterNative 的實現非常簡單,就是將class里面native的方法的地址 1指向執行的c代碼的函數地址也就是上面的&JVM_AssertionStatusDirectives

  address* native_function_addr() const          { assert(is_native(), "must be native"); return (address*) (this 1); 







最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复