除了前面說的自定義JNI函數之外,JNI還提供了兩個特殊函數,它們是JNI_OnLoad()和JNI_OnUnload(),分別在加載庫和卸載庫的時候調用。
1、JNI_OnLoad()
Java調用System.loadLibrary()加載一個庫的時候,會首先在庫中搜索JNI_OnLoad()函數,如果該函數存在,則執行它;
JNI_OnLoad()的作用主要有幾點:
1、告訴JVM,這個庫需要要求使用的JNI版本是什么
2、執行初始化操作
3、將JavaVM參數保存為全局對象,方便以后在任何地方獲取JNIEnv對象(后面會介紹)
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { JNIEnv *env = NULL; jint result = -1; if (jvm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { return -1; } result = JNI_VERSION_1_4; return result; }
如果一個庫不存在JNI_OnLoad()函數,那么JVM默認會使用最老版本的JNI,即1.1。
JNI_OnLoad方法在每一個庫中只能存在一個。
2、JNI_OnUnload()
According to the JNI documentation, it will be called when the classloader that loaded the libarary is garbage collected.
根據JNI文檔的描述,當GC回收了加載這個庫的ClassLoader時,該函數被調用
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) { //TODO- }