一:前言
之前android調用so庫的時候都是jni調用
jni調用需要自己寫Native和頭文件及Android.mk
我們可以直接採用jna調用
github鏈接:https://github.com/java-native-access/jna
會比jni簡單很多
二,具體
1,安裝rust
curl https://sh.rustup.rs -sSf | sh
2,安裝 Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
3,Config ~/.cargo/config
[target.aarch64-linux-android]
ar = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar"
linker = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android22-clang.cmd"
[target.armv7-linux-androideabi]
ar = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar"
linker = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi22-clang.cmd"
[target.i686-linux-android]
ar = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ar"
linker = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android22-clang.cmd"
[target.x86_64-linux-android]
ar = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ar"
linker = "/Users/xxx/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android22-clang.cmd"
4,創建rust工程並編寫jna的調用代碼(lib.rs文件)
use std::os::raw::c_char;
#[no_mangle]
pub unsafe extern "C" fn get_str(str: *const c_char) -> *const c_char{
str
}
5,工程下Cargo.toml文件增加下面代碼
[lib]
name = "NativePluginRust"
crate-type = ["dylib"]
[target.'cfg(target_os="android")'.dependencies]
jni = { version = "0.1", default-features = false }
6,直接進行build生成對應的so
cargo build --target armv7-linux-androideabi --release
target目錄下生成對應cpu架構的 libNativePluginRust.so
7,android端
1,gradle引用jna依賴
2,調用
static {
System.loadLibrary("NativePluginRust");
}
public interface CStr extends Library {
String get_str(String str);
}
private void getStr(){
final CStr cStr = (CStr) Native.loadLibrary("NativePluginRust", CStr.class);
String str = cStr.get_str("開始調用了");
System.out.println("str: " + str);
}