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
相关产品推荐
相关产品推荐

