歡迎您光臨本站 註冊首頁

簡介

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

應用外掛

通過外掛 DSL 整合


 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 工程路徑即可。

build.gradle


 android {
     externalNativeBuild {
         xmake {
             path "jni/xmake.lua"
         }
     }
 }
 

JNI

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")
 

更多 Gradle 配置說明


 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
         }
     }
 }
 

編譯 JNI

編譯 JNI 並且生成 APK

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
 

強制重建 JNI


 $ ./gradlew nativelib:xmakeRebuild

[admin ]

來源:OsChina
連結:https://www.oschina.net/news/114960/xmake-gradle-1-0-7-released
xmake-gradle 外掛 v1.0.7 釋出,整合 xmake 快速構建 Android JNI 程式已經有135次圍觀

http://coctec.com/news/all/show-post-230511.html