新撸的 gradle 插件,集成 xmake 构建 Android JNI 程序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
waruqi

新撸的 gradle 插件,集成 xmake 构建 Android JNI 程序

  •  
  •   waruqi
    waruqi 2020 年 4 月 17 日 1528 次点击
    这是一个创建于 2198 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    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, 86_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 

    -

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1487 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 16:59 PVG 00:59 LAX 09:59 JFK 12:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86