AndroidStudio 3.0 NDK開發2-AAR模組封裝
完成了對JNI的編譯,有時候是使用aar包提供給其他同學使用;或者說在共同開發的一個專案中,並不是每個人都需要開發C、C++功能。所以沒必須每臺電腦都配置好NDK的編譯環境,所以大多數還是以AAR包的方式放在專案中。我們接下來就是完成這個事件;
JNI部分抽象成Module
第一步,file->new->new module
第二步,建立Android Library
第三步,按照《 ofollow,noindex" target="_blank">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類,具體實現就可以在這裡面來寫。