xmake-gradle是一個無縫整合 xmake 的 gradle 外掛。
目前在 gradle 中做 android jni 相關整合開發,有兩種方式,通過 ndkBuild 或者 CMake 來支援,gradle 也內建了這兩工具的整合
但是維護 Android.mk 還是非常繁瑣的,尤其是對於大型專案會比較痛苦,而 cmake 的 dsl 語法不夠簡潔直觀,我個人也不是很喜歡,因此我先前整了 xmake 來實現跨平臺開發,優勢就是: 簡單,快速,對新手友好,另外功能也很強大,具體有那些功能,大家可以到 xmake 專案主頁看下相關介紹。
而之前想要用 xmake 編譯 android so 庫,只能通過命令列的方式比如:
xmake f -p android --ndk=xxxx
xmake
雖然已經很簡單了,但是如果要跟 android apk/aar 一起打包整合,還是需要很多額外的工作,為了提高開發者的效率,我最近新整了這個 grafle 外掛,來無縫整合到 gradle 的整個構建體系中去。
這樣,使用者就可以在 android studio 中方便的用 xmake 來編譯 jni 庫,以及自動集成了。
另外,相關 gradle 配置基本跟 cmake 和 ndkbuild 的保持一致,大部分都是相容的,切換成本也會降低很多。
歡迎大家來試試哦,新鮮出爐的外掛,如果你想要了解更多,請參考:
我們需要先安裝好對應的 xmake 命令列工具,關於安裝說明見:xmake。
plugins {
id 'org.tboox.gradle-xmake-plugin' version '1.0.6'
}
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'org.tboox:gradle-xmake-plugin:1.0.6'
}
repositories {
mavenCentral()
}
}
apply plugin: "org.tboox.gradle-xmake-plugin"
如果我們新增xmake.lua
檔案到projectdir/jni/xmake.lua
,那麼我們只需要在 build.gradle 中啟用生效了 xmake 指定下對應的 JNI 工程路徑即可。
android {
externalNativeBuild {
xmake {
path "jni/xmake.lua"
}
}
}
JNI 工程結構
projectdir
- src
- main
- java
- jni
- xmake.lua
- *.cpp
xmake.lua:
add_rules("mode.debug", "mode.release")
target("nativelib")
set_kind("shared")
add_files("nativelib.cc")
android {
defaultConfig {
externalNativeBuild {
xmake {
// 追加設定全域性 c 編譯 flags
cFlags "-DTEST"
// 追加設定全域性 c++編譯 flags
cppFlags "-DTEST", "-DTEST2"
// 設定切換編譯模式,與`xmake f -m debug`的配置對應,具體模式值根據自己的 xmake.lua 設定而定
buildMode "debug"
// 設定需要編譯的 abi 列表,支援:armeabi, armeabi-v7a, arm64-v8a, x86, x86_64
// 如果沒有設定的話,我們也支援從 defaultConfig.ndk.abiFilters 中獲取 abiFilters
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}
externalNativeBuild {
xmake {
// 設定 jni 工程中 xmake.lua 根檔案路徑,這是必須的,不設定就不會啟用 jni 編譯
path "jni/xmake.lua"
// 啟用詳細輸出,會顯示完整編譯命令列引數,其他值:verbose, warning, normal
logLevel "verbose"
// 指定 c++ stl 庫,預設不指定會使用 c++_static,其他值:c++_static/c++_shared, gnustl_static/gnustl_shared, stlport_static/stlport_shared
stl "c++_shared"
// 設定 xmake 可執行程式路徑(通常不用設定)
// program /usr/local/bin/xmake
// 禁用 stdc++庫,預設是啟用的
// stdcxx false
// 設定其他指定的 ndk 目錄路徑 (這是可選的,預設 xmake 會自動從$ANDROID_NDK_HOME 或者`~/Library/Android/sdk/ndk-bundle`中檢測)
// 當然如果使用者通過`xmake g --ndk=xxx`配置了全域性設定,也會自動從這個裡面檢測
// ndk "/Users/ruki/files/android-ndk-r20b/"
// 設定 ndk 中 sdk 版本
// sdkver 21
}
}
}
當gradle-xmake-plugin
外掛被應用生效後,xmakeBuild
任務會自動注入到現有的assemble
任務中去,自動執行 jni 庫編譯和整合。
$ ./gradlew app:assembleDebug
> Task :nativelib:xmakeConfigureForArm64
> Task :nativelib:xmakeBuildForArm64
>> xmake build
[ 50%]: ccache compiling.debug nativelib.cc
[ 75%]: linking.debug libnativelib.so
[100%]: build ok!
>> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/arm64-v8a
> Task :nativelib:xmakeConfigureForArmv7
> Task :nativelib:xmakeBuildForArmv7
>> xmake build
[ 50%]: ccache compiling.debug nativelib.cc
[ 75%]: linking.debug libnativelib.so
[100%]: build ok!
>> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/armeabi-v7a
> Task :nativelib:preBuild
> Task :nativelib:assemble
> Task :app:assembleDebug
$ ./gradlew nativelib:xmakeRebuild
[admin
]