Как скомпилировать и связать код ржавчины с пакетом приложений для 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 файл для компиляции моего кода ржавчины, а затем назвать это как последний шаг, но было бы неплохо упростить это и выяснить, почему он работает.