内容简介:完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;第一步,file->new->new module
完成了对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类,具体实现就可以在这里面来写。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- mongodb操作的模块手动封装
- MATLAB/simulink模块的封装
- SpringBlade 2.2.1 发布,抽离封装代码生成模块
- 封装JDBC—非框架开发必备的封装类
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
跨平台桌面应用开发:基于Electron与NW.js
【丹】Paul B. Jensen / Goddy Zhao / 2018-3 / 99
《跨平台桌面应用开发:基于Electron与NW.js》是一本同时介绍 Electron和 NW.js的图书,这两者是目前流行的支持使用 HTML、CSS 和 JavaScript 进行桌面应用开发的框架。书中包含大量的编码示例,而且每个示例都是五脏俱全的实用应用,作者对示例中的关键代码都做了非常详细的解释和说明,可让读者通过实际的编码体会使用这两款框架开发桌面应用的切实感受。除此之外,在内容上,......一起来看看 《跨平台桌面应用开发:基于Electron与NW.js》 这本书的介绍吧!