HarmonyOS鸿蒙Next中调用dlopen时显示无权限

HarmonyOS鸿蒙Next中调用dlopen时显示无权限 大佬们,C++调用dlopen打开应用沙箱目录时失,显示无权限,是怎么回事呢?沙箱目录下的动态库正常应该是有权限打开的啊,一下是详细日志:

Line  8597:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load absolute_path /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so: check ns accessible failed namespace=moduleNs_default.

Line  8598:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load absolute_path /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so: check ns accessible failed namespace=default.

Line  8599:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so failed, namespace=default no inherits, errno=13

Line  8600:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load absolute_path /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so: check ns accessible failed namespace=ndk.

Line  8601:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so failed, namespace=ndk no inherits, errno=13

Line  8602:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: load /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so failed, namespace=moduleNs_default, errno=13

Line  8603:  2026-06-08 15:36:49 28225-28225/hdc W/C03F07/MUSL-LDSO: dlopen_impl load library header failed for /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so

dlerror:Error loading shared library /data/storage/el1/bundle/entry/libs/arm64-v8a/libijkplayer.so: Permission denied


更多关于HarmonyOS鸿蒙Next中调用dlopen时显示无权限的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

目录地址这里希望DevEco有规则的检测和自动修正就好了,我也遇到差不多的

更多关于HarmonyOS鸿蒙Next中调用dlopen时显示无权限的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


看着大佬的悬赏有点眼馋啊,O(∩_∩)O哈哈~

已解决,目录拼接错了

HarmonyOS的社区里有很多技术大牛分享经验,学到了很多有用的知识。

HarmonyOS的分布式文件系统让我在多设备间共享文件变得更加方便。

将.so文件直接打包在 HAP 包里吧。将so文件放置在工程的libs/或src/main/cpp/libs目录下(取决于构建配置),随应用一起安装。这样系统会自动将其路径加入允许列表,使用dlopen(“libname.so”)加载即可。

在HarmonyOS Next中,dlopen需经过系统安全策略校验。应用只能加载自身bundle内或已声明的共享库,且需配置ohos.permission.GET_BUNDLE_INFO_PRIVILEGED等权限。建议使用AbilityContext的loadModuleresourceManager接口替代。若加载系统库,应用需具有system级别签名。

HarmonyOS Next 中 dlopen 报权限拒绝,是因为动态链接器的命名空间隔离机制。即使指定的 .so 位于应用自己的沙箱路径(/data/storage/el1/bundle/entry/libs/...),直接使用绝对路径加载也会触发 check ns accessible failed,因为调用方所在命名空间不允许访问该绝对路径指向的文件。不同命名空间(如 moduleNs_default, default, ndk)均未通过检查,最终 errno=13

解决方法

  1. libijkplayer.so 放在 entry 模块的 libs/{arch} 目录下。
  2. module.json5 中声明该 native 库(配置 nativeLib 字段),确保打包时签名。
  3. 代码中仅使用库名加载,不带路径
    void* handle = dlopen("libijkplayer.so", RTLD_LAZY);
    
    系统会根据模块的 native 库声明,自动从正确的命名空间加载,不再出现权限问题。
  4. 如果确实需要绝对路径(如动态下载的库),则必须请求系统级别权限,普通应用无法实现;HarmonyOS 推荐使用上述标准方式。
回到顶部