天天看點

JNI_OnLoad調用時機

       JNI_OnLoad是在加載so的時候調用的,也就是System.loadLibrary("test")時候調用的。具體調用步驟如下:

System.loadLibrary(libName)->Runtime.loadLibrary(libName,classLoader)->Runtime.doLoad(libName,loader)->Runtime.nativeLoad(name,loader,ldLibraryPath)->JavaVMExt.loadNativieLibrary:(JavaVMExt* vm=Runtime::Current()->GetJavaVM(); vm->LoadNativieLibrary(filename,classloader,detail))->jni_internal.cc::LoadNativieLibrary->dlopen,dlsym->JNI_OnLoad。

以上給出了調用順序,具體代碼可以根據類名或方法名看出。有興趣的可以自己檢視下源碼。

在Runtime.loadLibrary中,會在多個多個路徑下尋找對應的so,隻要找到了就會去加載,加載成功就會傳回。對應代碼如下:

Runtime.java

mLibPaths初始化代碼如下: