31

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

 5 years ago
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

uUbM7rE.png!web

第二步,创建Android Library

jMNNvee.png!web

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

第四步,生成AAR文件

执行gradule任务assebleRelease

nMrUZrF.png!web

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

JAR位于以下位置:

A3uEZbm.png!web

AAR位于以下位置:

AN7B7rY.png!web

这个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目录

JVfq6rq.png!web

扩展

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

AnQfQvY.png!web

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

emEfYf7.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK