

AndroidStudio 3.0 NDK开发2-AAR模块封装
source link: http://www.koffuxu.com/android/791.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;
JNI部分抽象成Module
第一步,file->new->new module
第二步,创建Android Library
第三步,按照《 AndroidStudio 3.0 NDK开发1——环境搭建与编译 》写Java代码与C代码
第四步,生成AAR文件
执行gradule任务assebleRelease
第五步,查看JAR以及AAR文件
JAR位于以下位置:
AAR位于以下位置:
这个usbrcvoicelib-release.aar就是我们需要的AAR文件,在需要项目中导入即可。
自定义gradle任务
但为更方便,我们需要新加一个自定义的gradle任务,用来把aar文件重命名并放到指定目录;
第一步,在module的android{}域里面写如下任务
//generateAar是任务名称,推荐通过mouldeName+actionName(考虑多模块问题) //类型是copy操作 task generateAar(type: Copy) { //指定来源文件夹 from('build/outputs/aar') //指定目的文件夹(目的文件如果已经存在,不需要先执行删除,会执行覆盖.) into('outputs') //指定来源文件 include('*.aar') }
10
10
1
//generateAar是任务名称,推荐通过mouldeName+actionName(考虑多模块问题)
2
//类型是copy操作
3
task generateAar(type: Copy) {
4
//指定来源文件夹
5
from('build/outputs/aar')
6
//指定目的文件夹(目的文件如果已经存在,不需要先执行删除,会执行覆盖.)
7
into('outputs')
8
//指定来源文件
9
include('*.aar')
10
}
第二步,在Terminal里面执行如下命令
C:\Users\koffuxu\02-sulab\aispeech-tools>gradlew generateAar
1
1
C:\Users\koffuxu\02-sulab\aispeech-tools>gradlew generateAar
第三步,确认在模块的根目录有一个outputs目录
、
扩展
以上的应用场景就是由JAVA层提出来需要什么接口,再来实现C部分代码,还有一种情况,就是先有C的代码,来生成相应的JAVA代码,这就是使用swig插件的方式。接下来演示一下。
第一步,先下载swig,解压写入Path的环境变量,http://www.swig.org/download.html;
第二步,在main/jni下面,写一个swig_demo.i格式文件,这里面主要是接口定义,里面的格式参考swig文档;
%module swigDemo %{ /* Put header files here or function declarations like below */ extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time(); %} extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time();
x
1
%module swigDemo
2
%{
3
/* Put header files here or function declarations like below */
4
extern double My_variable;
5
extern int fact(int n);
6
extern int my_mod(int x, int y);
7
extern char *get_time();
8
%}
9
10
extern double My_variable;
11
extern int fact(int n);
12
extern int my_mod(int x, int y);
13
extern char *get_time();
第三步,配置一下生成swig的gradle任务
// Location of where to store the jni wrapped files def coreWrapperDir = new File("${projectDir}/src/main/java/com/swig/test") task createCoreWrapperDir { coreWrapperDir.mkdirs() } // For this to work, it's assumed SWIG is installed // TODO: This only works when called from Command Line (gradlew runSwig) task runSwig(type:Exec, dependsOn: ['createCoreWrapperDir']) { String osName = System.getProperty("os.name").toLowerCase(); if (osName.contains("windows")) { workingDir '/src/main/jni' // This implicitly starts from $(projectDir) evidently commandLine 'cmd', '/c', 'swig' args '-java', '-package', 'com.swig.test', '-outdir', coreWrapperDir.absolutePath, 'swig_demo.i'//自己编写的.i文件 } else { commandLine 'swig' args '-c++', '-java', '-package', 'com.swig.test', '-outdir', coreWrapperDir.absolutePath, "${projectDir}/src/main/jni/Unix.i" } }
x
1
// Location of where to store the jni wrapped files
2
def coreWrapperDir = new File("${projectDir}/src/main/java/com/swig/test")
3
4
task createCoreWrapperDir {
5
coreWrapperDir.mkdirs()
6
}
7
8
// For this to work, it's assumed SWIG is installed
9
// TODO: This only works when called from Command Line (gradlew runSwig)
10
task runSwig(type:Exec, dependsOn: ['createCoreWrapperDir']) {
11
12
String osName = System.getProperty("os.name").toLowerCase();
13
if (osName.contains("windows")) {
14
workingDir '/src/main/jni' // This implicitly starts from $(projectDir) evidently
15
commandLine 'cmd', '/c', 'swig'
16
args '-java', '-package', 'com.swig.test', '-outdir', coreWrapperDir.absolutePath, 'swig_demo.i'//自己编写的.i文件
17
}
18
else {
19
commandLine 'swig'
20
args '-c++', '-java', '-package', 'com.swig.test', '-outdir', coreWrapperDir.absolutePath, "${projectDir}/src/main/jni/Unix.i"
21
}
22
}
第四步,执行runSwig任务,就会看到在/src/main/java/com/swig/test/生成相应的Java类
同步在jni里面会生成_wrap类,具体实现就可以在这里面来写。
Recommend
-
75
前提 JNI开发主要有两种方式,一种是在Android源码中编译,另外一种是使用AndroidStuido工具开发。主要是看自己的业务场景。 如果你们公司是平台型开发方式,很容易或者当前就是在Android源码中做项目,推荐使用第一...
-
11
Flutter混合开发之打包aar并上传到nexus 今天我必须得写篇博客来记录下这“历史性”的时刻,耗时3天终于算是搞出来了。此时此刻只有一张图能形容我现在的状态。
-
14
如何定位Android NDK开发中遇到的错误 Android NDK是什么,为什么我们要用NDK? Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用...
-
6
昨天把 gradle 升级到 6.0 以后,发现这傻逼的 google 又直接干 API,以前上报的全部脚本都没法用了。我们原先上报一个 aar,是直接引入 apply plugin: 'maven' 结果新版本...
-
7
Android Studio 打包及引用 aar – Android开发中文站你的位置:Android开发中文站 > Android开发 >
-
6
更新于 2021/08/8 | 创建于 2021/08/8 如何在flutter插件中使用本地aar库 当你使用Golang语言编写一个android安卓的库,并且编译为android的arr格式库时,你需要...
-
5
Create an Android Library (AAR)Steps to create an Android library, blockers while creating it and how to resolve themPhoto by
-
2
Copy link Author
-
11
Android入门第14天-AndroidStudio本机开发环境中gradle、sdk以及AVD目录的迁移 ...
-
10
在Android开发中,有时候出于安全,性能,代码共用的考虑,需要使用C/C++编写的库。虽然在现代化工具链的支持下,这个工作的难度已经大大降低,但是毕竟万事开头难,初学者往往还是会遇到很多不可预测的问题。本篇就是基于此背景下写的一份简陋指南,希望能对刚开始编...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK