HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found

HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found

环境

windows 10
DevEco Studio 5.0.2 自带的ndk工具
Mate 60

构建

用的sole这个三方库生成uuid
https://github.com/r-lyeh-archived/sole

下载后放到项目目录,目录结构如下

build
sole
  sole.hpp
main.cpp

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.15)

PROJECT(HELLO)

include_directories(
    sole
)

set(CMAKE_CXX_STANDARD 11)

add_definitions(-std=c++11 -lrt)

ADD_EXECUTABLE(hello main.cpp)

main.cpp

#include <string>
#include <sole.hpp>

int main() {
    std::string uuid = sole::uuid4().str();
    printf("%s\n", uuid.c_str());
    return 0;
}

构建命令,在build目录下执行

"C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\cmake.exe" -G "Ninja" -DOHOS_STL=c++_shared -DOHOS_ARCH=arm64-v8a -DOHOS_PLATFORM=OHOS -DCMAKE_MAKE_PROGRAM="C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\ninja.exe" -DCMAKE_TOOLCHAIN_FILE="C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build\cmake\ohos.toolchain.cmake" ..

再在build目录下执行

"C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\ninja.exe" -f build.ninja

将构建好的hello用hdc工具推送至鸿蒙,并执行,仅返回如下错误

Error relocating /data/local/tmp/hello: __emutls_get_address: symbol not found

更多关于HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,使用NDK构建三方库时,推送真机运行报错 __emutls_get_address: symbol not found,通常是由于NDK的编译环境与鸿蒙系统的ABI(应用二进制接口)不兼容导致的。鸿蒙系统使用了自己的ABI,与Android的ABI存在差异,特别是在处理线程本地存储(TLS)时。

NDK默认生成的二进制文件可能依赖于Android的libcbionic库,而鸿蒙系统使用的是自己的musl libc库,这会导致在鸿蒙系统上运行时找不到某些符号,如__emutls_get_address

解决方法通常是确保在编译三方库时,使用与鸿蒙系统兼容的工具链和编译选项。鸿蒙系统提供了自己的编译工具链,开发者需要使用鸿蒙的编译工具链来重新编译三方库,而不是直接使用NDK生成的二进制文件。

具体操作包括:

  1. 使用鸿蒙系统提供的ohos-clangohos-gcc等工具链进行编译。
  2. 确保编译时指定了鸿蒙系统的ABI和相关库路径。
  3. 检查并修改三方库的源码,确保其与鸿蒙系统的ABI和库兼容。

通过这些步骤,可以解决__emutls_get_address: symbol not found的报错问题。

更多关于HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用NDK构建的三方库在真机运行时出现__emutls_get_address: symbol not found错误,通常是因为NDK构建时使用了与目标设备不兼容的ABI(如x86模拟器)或未正确配置NDK工具链。建议检查以下几点:

  1. ABI匹配:确保NDK构建时使用的ABI与目标设备的架构一致(如arm64-v8a)。
  2. NDK版本:使用与HarmonyOS兼容的NDK版本,并确保工具链配置正确。
  3. 链接库:检查是否遗漏了必要的系统库或依赖库。
  4. 调试信息:通过adb logcat查看详细日志,定位具体问题。

如果问题仍未解决,建议重新编译三方库,并确保所有依赖项正确配置。

回到顶部