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初始化代碼如下: