这篇是关于rust在Android端探索的第二篇,第一篇可以在这看:。
上一篇,难得有网友评论,说是太麻烦了,mozilla有提供编译rust的插件, 故学习学习。
Rust使用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 "https://plugins.gradle.org/m2/"
}
}
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库工程的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的安装包
// https://www.oracle.com/java/technologies/downloads/#jdk17-mac
// 2. 安装完成之后,终端检查JDK版本
java -version
// 结果如下
java version "17.0.8" 2023-07-18 LTS
Java(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的编写。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved