AndroidStudio 3.0 NDK开发2-AAR模块封装

栏目: C++ · 发布时间: 5年前

内容简介:完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;第一步,file->new->new module

完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;

JNI部分抽象成Module

第一步,file->new->new module

AndroidStudio 3.0 NDK开发2-AAR模块封装

第二步,创建Android Library

AndroidStudio 3.0 NDK开发2-AAR模块封装

第三步,按照《 AndroidStudio 3.0 NDK开发1——环境搭建与编译 》写 Java 代码与C代码

第四步,生成AAR文件

执行gradule任务assebleRelease

AndroidStudio 3.0 NDK开发2-AAR模块封装

第五步,查看JAR以及AAR文件

JAR位于以下位置:

AndroidStudio 3.0 NDK开发2-AAR模块封装

AAR位于以下位置:

AndroidStudio 3.0 NDK开发2-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目录

AndroidStudio 3.0 NDK开发2-AAR模块封装

扩展

以上的应用场景就是由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类

AndroidStudio 3.0 NDK开发2-AAR模块封装

同步在jni里面会生成_wrap类,具体实现就可以在这里面来写。

AndroidStudio 3.0 NDK开发2-AAR模块封装


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

颠覆医疗

颠覆医疗

[美]埃里克·托普 / 张南、魏薇、何雨师 / 译言·东西文库/电子工业出版社 / 2014-1-20 / 55.00

“创造性破坏”是奥地利经济学家约瑟夫·熊彼特最著名的理论,当一个产业在革新之时,都需要大规模地淘汰旧的技术与生产体系,并建立起新的生产体系。电器之于火器、汽车之于马车、个人计算机之于照排系统,都是一次又一次的“创造性破坏”,旧的体系完全不复存在,新的体系随之取代。 “创造性破坏”已经深深地改变了我们的生活,在这个数字时代,我们身边的一切都被“数字化”了。只有一处,也许是由于其本身的根深蒂固,......一起来看看 《颠覆医疗》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试