Android Studio with Build-in Rust

Android Studio with Build-in Rust

使用 gradle 集成

https://github.com/mozilla/rust-android-gradle
要跟着这个走,然后添加到 gradle 里面
Project Gradle

buildscript {
    repositories {
        maven {url "https://plugins.gradle.org/m2/"}
    }
    dependencies {classpath 'org.mozilla.rust-android-gradle:plugin:0.9.3'}
}

app build.gradle

android {...}

apply plugin: 'org.mozilla.rust-android-gradle.rust-android'

cargo {
    module  = "../rust"       // Or whatever directory contains your Cargo.toml
    libname = "rust"          // Or whatever matches Cargo.toml's [package] name.
    targets = ["arm", "x86"]  // See bellow for a longer list of options
}

然后我就发现我的 Android Studio 不识别 ndk 了。。。逆天

只能手动指定 ndk 版本,android{} 中添加

ndkVersion "26.1.10909125"

之后编译能生成,但是会发现没法集成到 apk。。。

手动在 android{} 内添加

    sourceSets {main.jniLibs.srcDirs = ['rustJniLibs']
    }

Rust

Rust 部分没啥好说的,注意不要 mangle 然后导出为 c 函数就行

然后注意一点,需要 extern crate jni,不然会找不到这个库

Update

tmd,突然发现如果改了函数名称就需要重新 export 一下,不然会找不到函数,我怀疑可能和 sb AndroidStudio 的部署优化有关,这个插件不是很兼容,然后就以为没有修改了,服了
解决的话我目前是改函数名之前 clean 一下整个 Project

new update

做了个临时的解决方法。。。
我直接删除了 intermediates 目录。。。
唉奇怪的 bug, 感觉要比每次 build 前都 clean 要稍微快一点?虽然也 tm 巨慢
在 app 的 build.gradle 里面 buildscript 块内添加一个任务

    tasks.register('deleteIntermediates', Delete) {delete fileTree(dir: "$buildDir/intermediates/apk", include: '**/*')
        delete fileTree(dir: "$buildDir/intermediates/merged_jni_libs", include: '**/*')
        delete fileTree(dir: "$buildDir/intermediates/merged_native_libs", include: '**/*')
        delete fileTree(dir: "$buildDir/intermediates/stripped_native_libs", include: '**/*')
    }

然后再在 android 块内添加 build 之前的任务

preBuild.dependsOn deleteIntermediates
正文完
 0
评论(没有评论)