添加__android_log_print后libtensorflowlite_jni.so加载失败求助
解决Android 7.1设备加载含
__android_log_print的TensorFlow Lite库失败问题 我来帮你排查这个问题——这个错误本质上是你的libtensorflowlite_jni.so在运行时找不到__android_log_print的实现,大概率是编译TFLite源码时没正确链接Android系统的log库导致的。结合你用的NDK r14b,咱们一步步解决:
1. 优先检查TFLite源码编译时的链接配置
__android_log_print属于Android系统的liblog.so库,必须在编译时显式链接它才能让符号被正确解析:
- 如果是用Android.mk编译:确保在对应的模块中添加
LOCAL_LDLIBS += -llog,比如在tensorflow/lite/java/jni/Android.mk里找到对应的LOCAL_MODULE块,加上这一行。 - 如果是用CMakeLists.txt编译:在构建
tensorflowlite_jni目标时,添加target_link_libraries(tensorflowlite_jni log),把log库作为依赖链接进去。 - 如果是用Bazel编译:在BUILD文件的
cc_library或cc_binary规则中,添加linkopts = ["-llog"],保证链接阶段引入log库。
2. 验证Android Studio项目的配置细节
虽然你提到已经加了配置,但再确认几个关键点:
- 检查
app/build.gradle中defaultConfig.ndk的abiFilters是否和你的Android 7.1设备匹配,比如设备是32位armeabi-v7a,就配置abiFilters 'armeabi-v7a',避免编译的so库ABI和设备不兼容。 - 确认jniLibs目录下的so文件是你新编译的版本,有没有被旧的未链接log库的so覆盖。
3. 排查NDK r14b的兼容性问题
NDK r14b是比较老旧的版本(2017年发布),虽然兼容Android 7.1(API 25),但可能存在一些链接行为的细节问题:
- 确保编译TFLite时指定的
APP_PLATFORM(Android.mk)或minSdkVersion(gradle)和设备API level一致,比如设置为android-25,避免因API level不匹配导致系统符号无法找到。 - 如果条件允许,尝试升级NDK到r17及以上的稳定版本(比如r21e),旧NDK在处理系统库符号时可能存在小bug,升级后大概率能解决问题。
4. 用工具验证so库的符号表
用NDK自带的nm工具检查你的libtensorflowlite_jni.so,确认__android_log_print的符号状态:
- 打开终端,进入NDK目录的工具链路径(比如
ndk-r14b/toolchains/llvm/prebuilt/linux-x86_64/bin/),执行命令:./arm-linux-androideabi-nm -D libtensorflowlite_jni.so | grep __android_log_print - 如果输出带
U标记,说明是未定义符号,回到第一步修正链接配置;如果带T标记,说明符号已正确链接,那大概率是ABI不匹配或设备系统异常(这种情况极少)。
5. 确认应用加载so的逻辑
检查TFLiteCameraDemo中加载so的代码,确保是System.loadLibrary("tensorflowlite_jni"),没有拼写错误,也没有重复加载其他版本的so库导致冲突。
内容的提问来源于stack exchange,提问作者Tsesar Rizqi
相关产品推荐
相关产品推荐

