• Lv4
    粉丝0

积分0 / 贡献0

提问1答案被采纳0文章0

作者动态

    OpenHarmony项目,如何使用系统里system/lib64里的so库?

    JunJunYeah 显示全部楼层 发表于 2024-11-4 10:55:26
    ### 【问题描述】
    使用hdc shell查看设备系统的库,想直接使用系统里system/lib64的so库

    1. 介绍问题现象和发生的背景![547cc8f108b30e25ef66e81d1f38dc3.png]( "547cc8f108b30e25ef66e81d1f38dc3.png")![1d12e90e7f18c6126375e0a010b2ad4.png]( "1d12e90e7f18c6126375e0a010b2ad4.png")
    2. 相关的代码(请勿使用截图)

       ```
       int FfmpegHelper::getFFmpegVersion() {
           // 加载动态库
           void *handle = dlopen("/system/lib64/libohosffmpeg.z.so", RTLD_LAZY);
           if (!handle) {
               OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "Test NAPI", "Cannot load library ");
               std::cerr << "Cannot load library: " << dlerror() << std::endl;
               return -1;
           }

           // 重置错误
           dlerror();

           // 获取函数指针
           av_version_func avcodec_version = (av_version_func)dlsym(handle, "avcodec_version");
           const char *error = dlerror();
           if (error) {
               OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "Test NAPI", "avcodec_version  %{public}d",error);
               std::cerr << "Cannot load symbol 'avcodec_version': " << error << std::endl;
               dlclose(handle);
               return -1;
           }

           // 调用函数
           const char *version = avcodec_version(LIBAVUTIL_VERSION_MAJOR, LIBAVUTIL_VERSION_MINOR, LIBAVUTIL_VERSION_MICRO);
           OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "Test NAPI", "avcodec_version  %{public}d", version);
           // 关闭动态库
           dlclose(handle);

           return 0;
       }
       ```
    3. 运行结果、错误截图

       ![1730688586350.png]( "1730688586350.png")
    4. 我尝试过的解决方法和结果

       我尝试用dlopen的方式去打开libohosffmpeg的库里面的方法avcodec_version 但是获取无效值
    5. 我想要达到的结果

       正常调用ffmpeg的函数方法

    ### 【运行环境】

    硬件:
    ROM版本:润和大禹系列HH-SCDAYU200开发套件 openharmony4.0
    DevEvoStudio版本:DevEco Studio 4.1 Release
    SDK版本:Api Version 11

    您尚未登录,无法参与评论,登录后可以:
    参与开源共建问题交流
    认同或收藏高质量问答
    获取积分成为开源共建先驱

    精彩评论3

    深开鸿_王石

    沙发 发表于 2024-11-11 16:03:29
    native应用默认就是找自己的应用的lib,你要想要system/lib里的so要不就自己拷贝出来,直接在工程里用,要不就得该这个应用的运行环境了,或者指定环境变量

    gcf20

    发表于 2025-1-6 11:16  IP属地: 湖北省襄阳市南漳县

    回复 深开鸿_王石: 王总,请问下
    在HM 3.2的环境下。我将libsec_shared.z.so文件拷贝出来了放在了代码libs/armeabi-v7a下面。放之前编译hap是不行的 放进去后可以编译成功。但是运行还是报错找不到这个so文件

    1. 2687  open("/system/lib/libressched_client.z.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC <unfinished ...>
    2. 2687  open("/system/lib/module/libprompt.z.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC <unfinished ...>
    3. 2687  open("/system/lib/module/libhilog.z.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC <unfinished ...>
    4. 2687  open("/data/storage/el1/bundle/libs/arm/libsoftbus_client_run.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC <unfinished ...>
    5. 2687  open("/data/storage/el1/bundle/libs/arm/libsec_shared.z.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    复制代码


    上面是strace的日志。很奇怪为什么libsec_shared.z.so在/data/storage/el1/bundle/libs/arm/中查找。这个库就是上边说的编译依赖的so文件,这so文件在/system/lib下存在。

    深开鸿_王石

    发表于 2025-1-8 18:03  IP属地: 山东省青岛市

    回复 gcf20: 找的/data/storage/el1这个路径就是因为你这个app路径,你自己把这个系统库从/system里弄出来放了进去,这是系统库哎,你用系统库应该看ndk里是否有,而不是自己考进hap

    【2 条回复】

    Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

    返回顶部