JNI原理 模仿System.loadLibrary和dlopen使用

前言

如下图所示,OpenNativeLibrary代码中使用了android_dlopen_ext打开动态库,本文按照该源码中调用dlopen、dlsym来调用so里的方法,加强一下理解。
继上文梳理了LoadLibrary源码流程,本文就是模仿该流程,在Java层获取到要调用so路径后,传入c层调用dlopen打开,并通过dlsym调用方法后dlclose结束。

void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
                        jobject class_loader, const char* caller_location, jstring library_path,
                        bool* needs_native_bridge, char** error_msg) {
   
#if defined(ART_TARGET_ANDROID)
  // 检验命名空间,防止本应用加载别的app的动态库
  std::lock_guard<std::mutex> guard(g_namespaces_mutex);
  NativeLoaderNamespace* ns;

  if ((ns = g_namespaces->FindNamespaceByClassLoader(env, class_loader)) == nullptr) {
   
    Result<NativeLoaderNamespace*> isolated_ns =
        CreateClassLoaderNamespaceLocked(env,
                                         target_sdk_version,
                                         class_loader,
                                         /*is_shared=*/false,
                                         /*dex_path=*/nullptr,
                                         library_path,
                                         /*permitted_path=*/nullptr,
                                         /*uses_library_list=*/nullptr);
    if (!isolated_ns.ok()) {
   
      *error_msg = 

你可能感兴趣的:(linux,c,c++,jni等,JNI,源码分析)