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