Как скомпилировать и связать код ржавчины в Android-приложение, упакованное APK
Я пытаюсь добавить код Rust к образцу Android NDK (native-активность); Всякий раз, когда я связываю код Rust (скомпилированный как.a) с.so, он не запускается.
Отсюда я получил информацию, чтобы получить компилятор ржавчины с поддержкой Android и "автономный набор инструментов" https://github.com/mozilla/rust/wiki/Doc-building-for-android
На канале Rust IRC кто-то предлагал упомянуть где-то "большой палец"; есть ли возможность перейти на rustc, или мне пришлось вначале собрать все по-другому?
Я, конечно, был в состоянии вызывать rust & c друг от друга на настольных сборках.
Есть ли пример, где у кого-то есть код ржавчины, работающий в.apk; это должно быть просто... очень сложно расшифровать make-файлы для сложных проектов. (Я думаю, что это будет очень трудно понять из чтения источника серво)
Я убедился, что этот процесс создает полезный пакет без добавления ржавчины; он не запускается, только если я связываю незаштрихованный код ржавчины - даже если он не достигнут (хотя связывание не говорит мне, что что-то не так). Если я удаляю вызов "rusty_android()", это работает. Если я перенесу вызов rusty_android в точку, которая не достигнута, она все равно не будет работать. Я могу проверить с помощью "nm", что "rusty_android" находится в.so... без изменений.
Это мой текущий процесс сборки: он взят из образца Android-native; я добавил исходный файл ржавчины с помощью единственной функции extern, возвращающей значение, и попытался отладить распечатку этого из C-файла примеров.
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"
1 ответ
Так как я написал это, кто-то помог, и у меня есть этот make-файл, который работает..
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)
Таким образом, используя это, можно связать предварительно собранную статическую библиотеку ржавчины в собственном процессе ссылки примеров ndk.
Так что же он делает за кулисами, librusty_android-> rust-prebuilt .. у него просто есть разные опции компоновщика, которые я пропустил? это как-то конвертирует библиотеку или подписывает?
Очевидно, я могу сделать один make-файл для компиляции моего кода ржавчины, а затем назвать это как последний шаг, но было бы неплохо упростить это и выяснить, почему он работает.