Android中使用Rust構建so庫

一:前言

   之前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);

      }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章