鸿蒙工程无法加载自己编译的so库
llvm-readelf工具路径为:${DevEco Studio安装目录}/sdk/default/openharmony/native/llvm/bin或者${command-line-tools安装目录}/sdk/default/openharmony/native/llvm/bin/llvm-readelf。如果预构建so没有SONAME,链接器将会将so的绝对路径插入到依赖这个so的二进
基于原先的c++代码,交叉编译鸿蒙平台的so库,在工程中无法加载起来,可能是so没有SONAME。
如果预构建so没有SONAME,链接器将会将so的绝对路径插入到依赖这个so的二进制文件的dynamic section中。当这些二进制文件随hap包发布运行时,动态加载器(dynamic loader)可能最终无法找到这个so而导致错误。
可以使用llvm-readelf工具查看so文件是否设置了SONAME。llvm-readelf工具路径为:${DevEco Studio安装目录}/sdk/default/openharmony/native/llvm/bin或者${command-line-tools安装目录}/sdk/default/openharmony/native/llvm/bin/llvm-readelf。

若预构建so使用cmake进行构建,则所有的so默认会设置SONAME(只要目标平台支持)。
若预构建so使用其他构建工具,可以通过配置ldflags来设置。

加上 -soname
没有soname的so库在工程中加载编译不会报错,只是在NDK中调用接口的时候不会实际执行,
编译中日志有警告 无法加载 LoadNativeModuleFailed

怀疑过工程中的NDK模块的名字 不能和预加载的so库的名字同名,实际和这个无关。
使用本地HAR中集成的预构建库
当使用本地HAR中集成的预构建库时,CMakeLists.txt文件中引用脚本如下所示:
${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/") 这个地址是工程生成so 的地方。
集成 NDK中的子模块 如下 ijksdl和ijkplayer 内部各有自己的CMakeLists.txt

更多推荐
所有评论(0)