前言:
当前大家对“so文件算法android”大概比较讲究,我们都想要知道一些“so文件算法android”的相关知识。那么小编同时在网络上汇集了一些关于“so文件算法android””的相关知识,希望同学们能喜欢,同学们一起来学习一下吧!这篇是关于Rust在Android端探索的第二篇,第一篇可以在这看: 探索Rust在Android端的使用(一)。
上一篇,难得有网友评论,说是太麻烦了,mozilla有提供编译rust的插件, 故学习学习。
Rust使用mozilla开源的rust-android-gradle插件进行编译
官方地址:GitHub - mozilla/rust-android-gradle
这个探索过程中,也遇到了一些问题,不过总体来说也算顺利,整理如下:
步骤1: 编辑项目的build.gradle文件,添加rust-android-gradle插件
详细代码如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { repositories { maven { url "; } } dependencies { classpath 'org.mozilla.rust-android-gradle:plugin:0.9.3' }}plugins { id 'com.android.application' version '8.0.1' apply false id 'com.android.library' version '8.0.1' apply false}
步骤2: 编辑应用模块的build.gradle文件,编写要编译的rust模块
关于Android和Rust的测试工程,上一篇有写:Rust学习笔记 - 探索Rust在Android端的使用(一)。
注意自己的Rust库工程的Cargo.toml位置。
plugins { id 'com.android.application'}apply plugin: 'org.mozilla.rust-android-gradle.rust-android'cargo { module = "../../rust_sdk/" // Or whatever directory contains your Cargo.toml libname = "rust_sdk" // Or whatever matches Cargo.toml's [package] name. targets = ["arm64"] // See bellow for a longer list of options apiLevel = 33 profile = 'release'}android { namespace 'com.example.hellorust' compileSdk 33 defaultConfig { applicationId "com.example.hellorust" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }}dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'}
步骤3: 编译的Rust模块
使用IDE内置的终端运行:./gradlew cargoBuild,如下图:
运行顺利的话,会生成目标的.so文件。如下图:
Rust编译遇到的错误
我这里主要是遇到一个错误,就是JDK的错误,内置终端运行./gradlew cargoBuild,遇到了下面错误:
大致意思是我Mac电脑的JDK环境是java8(jdk1.8), IDE声明的JDK环境是java11(jdk17)。
换句话说就是,终端编译使用的JDK环境是Mac系统的JDK环境,IDE编译使用的JDK环境是IDE自己指定的环境
知道了这个,就好解决了。
步骤1: 检查mac环境,发现mac的jdk版本为1.8
// 当前操作电脑是mac, 故这里就用mac来说明了// 检查mac的环境java -version// 结果显示如下java version "1.8.0 211"Java(TM) SE Runtime Environment (build 1.8.0 211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12,mixed mode)
步骤2: 检查IDE环境,发现IDE的jdk版本为17.0.6
查看IDE的JDK版本路径: File --> Project structure... 如下图:
步骤3: 同步系统JDK与IDE的JDK版本
这里我这里IDE选择JDK版本1.8的话,grade同步又出现问题,大概是grade的插件版本与JDK1.8不兼容吧,所以这里我就没改IDE里的JDK版本了。
直接改mac系统的JDK版本,我是直接选择从JDK官网下载安装。步骤如下:
// 1. 从JDK官网下载JDK17的安装包// 2. 安装完成之后,终端检查JDK版本java -version// 结果如下java version "17.0.8" 2023-07-18 LTSJava(TM) SE Runtime Environment (build 17.0.8+9-LTS-211)Java HotSpot(TM) 64-Bit Server VM (build 17.0.8+9-LTS-211, mixed mode, sharing)// 3. 系统JDK与IDE JDK版本一样之后,在IDE内置终端再次运行./gradlew cargoBuild
总结
这个插件探索下来,和上一篇自己写脚本编译android的动态库文件相比,简单多了。但这两种方法也还好,并不是很难,难的地方, 我感觉还是jni的编写。
标签: #so文件算法android