1、準備Android studio 開發工具
2、打開Android studio 創建一個項目
3、然後配置NDK:
下載依賴:SDK Manager → Android SDK → SDK Tools → ( 勾選CMake 、 勾選LLDB ; 這倆不需要翻牆)→ apply下載
1:翻牆後:SDK Manager → Android SDK → SDK Tools → 勾選NDK → apply下載
2:未翻牆:https://developer.android.google.cn/ndk/downloads/ 瀏覽器手動下載,下載完成複製路徑
4、右鍵項目 → Open Module → Android NDK Location → OK → 等待編譯
注意路徑不允許有空格
5、查看根目錄local.properties裏面多了NDK路徑
6、在根目錄gradle.properties下面加上 android.useDeprecatedNdk=true
7、在app下的build.gradle添加 ndk節點
8、編寫jni接口
I:創建一個JNIUtil的類,編寫一個native方法
II: Build -> Make Project 同步報錯:
Could not find method ndk() for arguments [build_891qepz0rctnrwl3xcb2ddug5$_run_closure1$_closure5@29f50b4f] on object of type com.android.build.gradle.AppExtension
解決:
把 ndk 放在 defaultConfig 裏面
defaultConfig {
ndk {
moduleName "JniNdk" //輸出.so的名字
}
}
III: 繼續(Build -> Make Project):
在/JniTestSample/app/build/intermediates/下面多了一個classes文件夾.我們可以打開AS下面的Terminal進入到classes下面的debug文件夾下
IV: 在Terminal執行一下javah com.bai.jnindk.JNIUtil
javah是後面是我的包名,執行完這句話以後在classes下會有個.h文件生成出來
9、實現.h對應的方法
I: 在main文件下新建一個jni文件夾
II:把剛纔生成的.h文件移動到新建的jni文件夾下,緊接着我們創建一個c++類來實現.h裏面聲明的方法.
我們把.h類純複製一份,把後綴名改成.cpp。裏面實現它的方法,我們在方法裏面返回一句話;
III: 在JNIUtil裏面加上
static{
System.loadLibrary("JniNdk");//名字注意,和build.gradle ndk節點下面的名字一樣
}
10、調用C++裏的方法:
JNIUtil jniUtil = new JNIUtil();
TextView showName = (TextView) findViewById(R.id.showResult);
showName.setText(jniUtil.getName());
11、運行一下,找.so文件(運行之前,把Terminal控制檯切出去,不要停留在build/intermediates/classes)
.so文件位置:build/intermediates/ndk/debug/lib
12、有了.so文件就可以直接用作庫來用,test一下
I:建一個新的項目TestJni,然後在 app下的 build.gradle添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
II:把剛纔生成的libJniNdk.so文件放入lib包下,然後同步
III:創建調用.so裏的方法
因爲.so裏的方法是 Java_com_bai_jnindk_JNIUtil_getName 所以調用.so方法的類也要在對應的包下
com.bai.jnindk/JNIUtil/getName 這三樣對應的一個都不可以錯,不然找不到會報錯
IV:MainActivity調用
JNIUtil jniUtil = new JNIUtil();
TextView showName = (TextView) findViewById(R.id.showResult);
showName.setText(jniUtil.getName());
OK,成功!具體要實現各項功能,大家自己用C++去做實現和調用。
本文JNINdk源碼