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

本文详细介绍了如何使用JNI,模仿Android的System.loadLibrary方法,通过dlopen、dlsym等函数加载并调用SO库中的方法。内容包括函数说明、示例步骤,帮助加深对动态链接库操作的理解。
摘要由CSDN通过智能技术生成

前言

如下图所示,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 = 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baiiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值