Windows下ndk-build编译时__android_log_write符号未定义问题求助
Android NDK .so项目链接
__android_log_write失败解决方案 问题描述
- 项目为混合配置,可编译为Windows下.dll或Android下.so,.dll运行正常,但.so启动前因NullPointerException崩溃
- 尝试添加LogCat日志输出,已在.c文件中加入
#include <android/log.h>,并手动复制NDK的android目录及头文件到项目 - 执行
ndk-build时出现链接错误:
ld: error: undefined symbol: __android_log_write
referenced by convolution.c:1527 (../convolution.c:1527)
- 确认头文件已被正确识别(替换为无效头文件会提示文件未找到),调用代码为
__android_log_write(3, "JoeDynamics", "bogoStart");,疑惑为何报错函数未定义而非参数错误
解决方案
1. 移除手动复制的NDK头文件
NDK自身已经包含android/log.h,不需要手动复制头文件到项目,保留代码中的#include <android/log.h>即可,NDK编译时会自动从自身路径查找头文件,手动复制反而可能引发路径冲突。
2. 链接Android Log库
错误核心是编译阶段未链接Android系统的log库——头文件仅声明函数,链接阶段需要指定对应的库文件:
- 若使用
Android.mk,在文件中添加LOCAL_LDLIBS += -llog:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := 你的模块名称 LOCAL_SRC_FILES := ../convolution.c # 你的源文件路径 LOCAL_LDLIBS += -llog # 添加此行链接log库 include $(BUILD_SHARED_LIBRARY)
- 若使用
CMakeLists.txt,在目标链接配置中加入log:
target_link_libraries(你的目标名称 log)
3. 简化日志调用(可选)
可以定义宏来简化日志写法,避免直接调用底层函数出错:
#define LOG_TAG "JoeDynamics" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
之后直接用LOGD("bogoStart");这类调用即可,更直观且不易出错。
4. .so崩溃调试建议
添加日志后仍崩溃的话,可以:
- 使用Android Studio的Native Debug功能,连接设备后加载.so模块并设置断点调试
- 执行
adb logcat -v threadtime命令查看崩溃时的原生栈信息,定位崩溃位置
内容的提问来源于stack exchange,提问作者user25849
相关产品推荐
相关产品推荐

