使用Rust编译一个cdylib的so库:
Cargo.toml
[lib]
crate-type = ["cdylib"]
在Android上用于动态链接:
Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := libmyso
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES := libmyso.so
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := mybin
LOCAL_SHARED_LIBRARIES := libmyso
LOCAL_SRC_FILES := mybin.cpp
include $(BUILD_EXECUTABLE)
编译出来二进制程序以后,发现在二进制程序里,so库的位置被写死了:
out/target/product/mydev/obj/lib/libmyso.so
这个问题找了两天,终于发现是Rust cargo在编译cdylib时,没有设置SONAME导致的。
在Rust项目里添加build.rs解决:
build.rs
fn main() {
println!("cargo:rustc-cdylib-link-arg=-Wl,-soname,libmyso.so");
}