如何编译和链接生锈代码到Android apk打包应用程序

cen*_*lug 14 android arm thumb android-ndk rust

我正在尝试将Rust代码添加到android NDK示例(native-activity); 每当我将Rust代码(编译为.a)链接到.so时,它都无法运行.

我从这里获取信息,以获得一个知识渊博的防锈编译器和'独立工具链' https://github.com/mozilla/rust/wiki/Doc-building-for-android

有人在Rust IRC频道上建议我需要在某处提到"拇指"; 是否可以选择传递给rustc,或者我是否必须首先以不同的方式构建它?

我当然能够在桌面版本上调用另外的rust&c.

是否有人在.apk中使用锈蚀代码; 它必须简单..很难破解复杂项目的makefile.(我认为通过阅读伺服源来解决这个问题非常困难)

我已经证实这个过程可以生成一个可用的包装而不会生锈; 如果我链接未经剥离的防锈代码 - 即使没有达到(即使链接没有告诉我任何错误),它也无法运行 .如果我删除对'rusty_android()'的调用,它就可以了.如果我将对garbage_android的调用移动到未到达的点,它仍然无效.我可以用'nm'验证'rusty_android'是否在.so ...中没有.

这是我目前的构建过程:它取自android native-activity示例; 我添加了一个带有单个extern功能的锈源文件,返回一个值,并尝试从样本的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()); }
Run Code Online (Sandbox Code Playgroud)

可能需要某些特定的"拇指"的东西来自比较LLVM IR和asm来源,但似乎很奇怪,除了'arm-linux-androideabi'之外,它还需要一个额外的选项.

cen*_*lug 7

自从我发布这个,有人帮忙了,我有这个makefile工作..

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := rust-prebuilt
LOCAL_SRC_FILES := librusty_android.a

include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)

LOCAL_MODULE    := native-activity
LOCAL_SRC_FILES := main.c

LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM 
LOCAL_STATIC_LIBRARIES +=  android_native_app_glue rust-prebuilt

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)
Run Code Online (Sandbox Code Playgroud)

因此,使用这个,可以在ndk示例自己的链接过程中链接预构建的生锈静态库.

那么它在幕后做了什么,librusty_android-> rust-prebuilt ..它是否只有我错过的不同链接器选项?是以某种方式转换图书馆,还是签名?

我可以明显地使一个单一makefile编译我的防锈代码,然后把这个作为最后一步,但它仍然是很好的简化了这一点,并找出为什么它的工作原理.

  • @Bastian:我的第一个修复是从Android NDK(定义_Unwind_GetGR,_Unwind_SetGR,_Unwind_GetIP,_Unwind_SetIP)获取unwind.c并链接它.我的第二个问题是切换到https://github.com/tomaka/android-rs-glue,开箱即用. (3认同)