Android加载Rust FFI库报错:找不到android_main符号
问题解答
为什么会出现android_main符号错误?
android_main是Android原生可执行程序的入口函数,动态库(.so)本身不需要这个符号。出现该错误的核心原因是你编译出的libgalileo.so带有可执行程序的链接特性,或是它依赖的某个库引用了android_main但未正确解析:
- 可能是Rust crate的编译类型配置错误,生成了可执行文件而非动态库;
- 也可能是编译时链接了需要
android_main的依赖库,导致符号未定义。
库加载失败的原因及修复方案
1. 确认Rust crate的编译类型
在galileo库的Cargo.toml中,必须明确设置编译为动态链接库:
[lib] crate-type = ["cdylib"] # 关键:生成适合FFI场景的动态库
如果之前设置为bin或未指定编译类型,会生成可执行文件,这类文件默认依赖android_main入口,直接导致加载失败。
2. 检查动态库的依赖与符号
使用Android NDK自带的readelf工具分析libgalileo.so:
# 替换为你的NDK路径和库文件路径 $NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-readelf -d ./android_ffi/x86/libgalileo.so
查看输出中的NEEDED项,确认是否有异常依赖库;再用readelf -s查看符号表,定位android_main是自身代码还是依赖库引入的问题。
3. 重新编译并验证
修改配置后,重新执行编译命令(建议用release模式测试):
cargo ndk -t i686-linux-android -o ./android_ffi build -p galileo --release
编译完成后,用file命令验证文件类型:
file ./android_ffi/x86/libgalileo.so
输出应包含shared object,确认是动态库而非可执行文件。
4. 确认JNA加载逻辑
确保Kotlin代码中加载库的方式正确:
// 在MainActivity中加载库 System.loadLibrary("galileo")
JNA会自动从jniLibs对应架构目录加载库,无需手动指定路径。
内容的提问来源于stack exchange,提问作者Maxim Gritsenko
相关产品推荐
相关产品推荐

