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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:53:15