我正在尝试将 Rust 代码添加到 android NDK 示例(本机活动);每当我将 Rust 代码(编译为 .a)链接到 .so 时,它就无法运行。
我从这里继续获取信息以获取 android 感知 rust 编译器和“独立工具链” https://github.com/mozilla/rust/wiki/Doc-building-for-android
有人在 Rust IRC 频道上建议我需要在某处提及“拇指”;是否有传递给 rustc 的选项,或者我是否必须首先以不同的方式构建它?
我当然能够在桌面版本上互相调用 rust & c。
是否有一个示例,其中有人在 .apk 中使用了 rust 代码;它必须很简单。要破译复杂项目的makefile非常困难。(我认为通过阅读伺服源很难弄清楚这一点)
我已经验证了这个过程会生成一个可用的包而不会生锈;如果我链接未剥离的 rust 代码,它只会无法运行 ——即使它没有达到(即使链接没有告诉我任何错误)。如果我删除对“rusty_android()”的调用,它就可以工作。如果我将对 rusty_android 的调用移动到未达到的点,它仍然不起作用。我可以用 'nm' 验证 'rusty_android' 是否在 .so ... 中。
这是我当前的构建过程:它取自 android native-activity 示例;我添加了一个带有单个 extern 函数返回值的 rust 源文件,并尝试从示例的 C main 调试打印
ANDROID_CXX = /opt/ndk_standalone/bin/arm-linux-androideabi-gcc
android:
$(ANDROID_CXX) -I/home/ME/android-ndk-r9b/sources/android/native_app_glue -c jni/main.c -o obj/local/armeabi/objs/native-activity/main.o
rustc --target=arm-linux-androideabi hello_android.rs -C android-cross-path=/opt/ndk_standalone --crate-type=staticlib -o rusty_android.a
$(ANDROID_CXX) -shared -o libs/armeabi/libnative-activity.so obj/local/armeabi/objs/native-activity/main.o obj/local/armeabi/libandroid_native_app_glue.a another.o rusty_android.a -llog -landroid -lEGL -lGLESv1_CM
ant debug
adb install -r bin/NativeActivity-debug.apk
adb shell am start -n com.example.native_activity/android.app.NativeActivity
hello_android.rs:-
use std::libc;
#[no_mangle]
pub extern fn rusty_android()->libc::c_int {
99 as libc::c_int
}
in main.c, inserted in android_main(..):-
{ extern int rusty_android(); LOGI("****rust says %d****", rusty_android()); }
通过比较 LLVM IR 和 asm 源,可能需要一些特定于“拇指”的东西的怀疑,但奇怪的是,这将是除“arm-linux-androideabi”之外的额外选项