- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试将 Rust 代码添加到 android NDK 示例( native Activity );每当我将 Rust 代码(编译为 .a)链接到 .so 时,它都无法运行。
我从这里继续获取信息以获得一个 android 感知的 rust 编译器和“独立工具链” https://github.com/mozilla/rust/wiki/Doc-building-for-android
有人在 Rust IRC channel 上建议我需要在某处提及“thumb”;是否有传递给 rustc 的选项,或者我是否必须首先以不同的方式构建它?
我当然能够在桌面构建中互相调用 rust 和 c。
是否有一个示例,其中有人在 .apk 中使用了 rust 代码;它必须很简单.. 很难破译复杂项目的 makefile。 (我认为通过阅读 Servo 源代码很难弄清楚这一点)
我已经验证了这个过程生成了一个可用的包而没有添加 rust;只有当我链接未剥离的 rust 代码时它才会运行 - 即使它没有到达(即使链接没有告诉我任何错误)。如果我删除对“rusty_android()”的调用,它会起作用。如果我将对 rusty_android 的调用移动到未达到的点,它仍然不起作用。我可以用“nm”验证“rusty_android”在 .so 中......未损坏。
这是我当前的构建过程:它取自 android native-activity 示例;我添加了一个带有单个外部函数返回值的 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 源时,怀疑可能需要一些特定的“thumb”,但奇怪的是,它是“arm-linux-androideabi”之上的额外选项
最佳答案
自从我发布这篇文章后,有人提供了帮助,我得到了这个有效的 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)
因此,使用它,可以在 ndk 示例自己的链接过程中链接一个预构建的 Rust 静态库。
那么它在幕后做了什么,librusty_android-> rust-prebuilt .. 它只是有不同的链接器选项我错过了吗?它是以某种方式转换 libray 还是对其进行签名?
我显然可以制作一个 makefile 来编译我的 rust 代码,然后将其作为最后一步调用,但简化它并找出它有效的原因仍然会很好。
关于android - 如何将 rust 代码编译并链接到 android apk 打包的应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22200621/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!