一、android studio的ndk環(huán)境搭建
1、下載安裝包
File-setting-Appearance&Behavior-System Settings-Android SDK-SDK Tools
找到NDK Cmake選項并選中,點擊Apply,會下載對應(yīng)的安裝包。
2、配置路徑
File-Project Structure-SDK Location配置下載的NDK的路徑
D:\software\sdk\ndk\21.0.6113669
(這個是我ndk下載存放的目錄,路徑一定要帶上ndk的版本號,如果遇到手動選路徑不可點擊的情況,就要去local.properties文件中,手動添加
sdk.dir=D:\software\sdk
ndk.dir=D:\software\sdk\ndk\21.0.6113669)
二、新建一個C++的工程
File-new-New Project 選擇 native C++ ,點next,生成C++工程,直接運行,會出現(xiàn)Hello from C++ 的提示語,這就是java直接調(diào)用本地C++代碼的Demo。
下面是C++代碼的實現(xiàn)部分,也是后面編譯成so文件的核心代碼
//#include <jni.h>
//#include <string>
//extern "C" JNIEXPORT jstring JNICALL
//Java_com_kn_ctest_MainActivity_stringFromJNI(
// JNIEnv* env,
// jobject /* this */) {
// std::string hello = "Hello from C++12567";
// return env->NewStringUTF(hello.c_str());
//}
三、CMake編譯生成so文件
Build-Make Project 就會在app/build/intermediates/cmake/debug/obj 目錄底下生成
armeabi-v7a arm64-v8a x86 x86_64四個文件,以及對應(yīng)平臺的libxxx.so文件(xxx默認就是新建項目的名稱,比如我的叫CTest,對應(yīng)的so文件名就叫l(wèi)ibctest.so)
(每次build-make project 的時候,要先刪除jniLibs文件夾下的so文件,否則會報錯
If you are using jniLibs and CMake IMPORTED targets, see )
四、調(diào)用.so及其方法
1、新建jniLibs文件
在app-src-main目錄底下,新建一個jniLibs文件,將app/build/intermediates/cmake/debug/obj 生成的armeabi-v7a文件一塊拷貝過來。
2、gradle配置jniLibs
gradle的android{}中 配置
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
并注釋掉 (不注釋掉,會導(dǎo)致調(diào)用stringFromJNI方法,調(diào)用不到so的方法,而是本地c++的方法)
// externalNativeBuild {
// cmake {
// path file('src/main/cpp/CMakeLists.txt')
// version '3.18.1'
// }
// }
Sync Now一下
3、調(diào)用so方法
在要調(diào)用C++的activity中,添加so文件加載方法
static {
System.loadLibrary("ctest");
}
調(diào)用C++中聲明的方法:
tv.setText(stringFromJNI());
public native String stringFromJNI();//該方法一定要和C++中聲明的方法一樣,而且包名路徑都要一樣,否則會調(diào)用失敗的。
直接運行,android調(diào)用自己ndk編譯的so文件,就成功了,soEasy!?。?/strong>