使用Rust编译Android SO库报错:找不到android/log.h文件
解决Rust编译Android SO库时
android/log.h找不到的错误 错误原因
bindgen生成C语言绑定的过程中,Clang无法定位到Android NDK提供的系统头文件android/log.h,核心原因是未正确配置NDK的sysroot路径。
解决方案
方法1:通过环境变量指定sysroot
在执行编译命令前,新增BINDGEN_EXTRA_CLANG_ARGS环境变量,明确指向NDK的sysroot目录:
export ANDROID_NDK=/home/adrian/code/leaf/android-ndk-r26b export CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android34-clang export AR=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar # 配置sysroot路径 export BINDGEN_EXTRA_CLANG_ARGS="--sysroot=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot" cargo build -p leaf-ffi --target x86_64-linux-android --release
方法2:在build.rs中显式配置bindgen
修改项目的leaf/build.rs文件,在bindgen构建逻辑中添加Clang的sysroot参数:
use bindgen; use std::env; fn main() { let android_ndk = env::var("ANDROID_NDK").expect("ANDROID_NDK环境变量未设置"); let sysroot_path = format!("{}/toolchains/llvm/prebuilt/linux-x86_64/sysroot", android_ndk); let bindings = bindgen::Builder::default() .header("src/mobile/wrapper.h") // 传入sysroot参数 .clang_arg(format!("--sysroot={}", sysroot_path)) .generate() .expect("无法生成绑定"); // 后续绑定文件生成逻辑... }
额外验证点
- 确认
${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/log.h文件实际存在 - 目标API等级(34)需在NDK支持范围内,r26b支持API 21及以上,当前配置符合要求
内容的提问来源于stack exchange,提问作者Fibonacci Leonardo
相关产品推荐
相关产品推荐

