You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android集成TensorFlow Lite时触发UnsatisfiedLinkError错误

解决Android中加载libtensorflowlite.so时找不到libm.so.6的问题

问题背景

在C++核心项目中集成libtensorflowlite.so并通过Android NDK封装为Android应用,已完成以下操作:

  • 执行TensorFlow官方编译命令:bazel build --config=elinux_aarch64 -c opt //tensorflow/lite/c:libtensorflowlite_c.so,成功生成库文件
  • 从TensorFlow源码目录获取tensorflow和flatbuffers所需头文件
  • 配置Android CMake如下:
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/include/tflite)

add_library(libtensorflowlite 
            SHARED 
            IMPORTED)

set_target_properties(
        libtensorflowlite 
        PROPERTIES 
        IMPORTED_LOCATION 
        ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/libs/tflite/arm64-v8a/libtensorflowlite.so
)
...
target_link_libraries(
...
#tflite
libtensorflowlite
...
)

运行应用时触发致命错误,核心报错:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libm.so.6" not found: needed by /data/app/~~0XEVJKwYyglTdlVABYHPjw==/com.example.my_proj-8OVBEONU7K3bv0RuyroYKA==/base.apk!/lib/arm64-v8a/libtensorflowlite.so in namespace classloader-namespace

问题原因

使用--config=elinux_aarch64编译的是针对通用嵌入式Linux的库,这类库依赖Linux标准命名的系统库(如libm.so.6)。但Android系统的数学库命名为libm.so,无版本后缀,导致库加载时无法找到匹配的依赖文件。

解决方案

1. 重新编译适配Android的库

替换原编译命令,使用TensorFlow官方提供的Android专用编译配置:

bazel build --config=android_arm64 -c opt //tensorflow/lite/c:libtensorflowlite_c.so

该配置会自动适配Android系统库的命名规则,生成符合Android环境要求的.so文件。

2. 验证库依赖(可选)

使用Android NDK中的readelf工具检查新编译库的依赖项,确认是否已替换为Android兼容的库:

${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin/aarch64-linux-android-readelf -d libtensorflowlite_c.so | grep NEEDED

正常输出中应显示依赖libm.so而非libm.so.6。

3. 更新CMake配置

将新编译生成的libtensorflowlite_c.so替换项目中原有的库文件,并确保CMake的IMPORTED_LOCATION路径指向新文件。

内容的提问来源于stack exchange,提问作者Turgut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:06:55