JNI原理(下)
一、注册JNI方法
接着上一篇,进入 JVM_NativeLoad 方法
JNIEXPORT jstring JVM_NativeLoad(JNIEnv* env,
jstring javaFilename,
jobject javaLoader,
jstring javaLibrarySearchPath) {
...
std::string error_msg;
{
art::JavaVMExt* vm =
art::Runtime::Current()->GetJavaVM();
bool success = vm->LoadNativeLibrary(env,
filename.c_str(),
javaLoader,
javaLibrarySearchPath,
&error_msg);
...
}
该方法主要做了一件事:
调用Java虚拟机加载nativeLibrary
进入JavaVMExt中查看 LoadNativeLibrary 方法
bool JavaVMExt::LoadNativeLibrary(JNIEnv* env,
const std::string& path,
jobject class_loader,
jstring library_path,
std::string* error_msg) {
...
SharedLibrary* library;
...
void* handle = android::OpenNativeLibrary(env,
runtime_->GetTargetSdkVersion(),
path_str,
class_loader,
library_path,
&needs_native_bridge,
error_msg);
...
bool created_library = false;
{
//通过创建一个 Android 的 Handle 并用其创建一个 SharedLibrary
std::unique_ptr<SharedLibrary> new_library(
new SharedLibrary(env,
self,
path,
handle,
needs_native_bridge,
class_loader,
class_loader_allocator));
MutexLock mu(self, *Locks::jni_lib