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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:10:36