什么是NDK?
NDK 是 Native Development Kit 的縮寫,是 Android 的工具開發(fā)包。它的作用是快速開發(fā) C/C++ 的動(dòng)態(tài)庫,并自動(dòng)將動(dòng)態(tài)庫與應(yīng)用一起打包到 apk。NDK 是屬于 Android 的,與 Java 無直接關(guān)系。NDK 是 Android 中實(shí)現(xiàn) JNI 的手段。那么什么是JNI呢?
什么是JNI
JNI 是 Java Native Interface 的縮寫,即 Java 的本地接口,是java與c語言等其他語言通信的橋梁。目的是使得 Java 與 C/C++進(jìn)行交互。
開始實(shí)戰(zhàn)
1.新建native方法
package com.sunql.ndkfrist;
public class JniLoader {
static {
System.loadLibrary("demo-lib");
}
public native String stringFromJNI();
public native String logFormJni();
}
2.創(chuàng)建jni目錄,生成jni文件,生成文件代碼如下
3.javah
-jni 生成進(jìn)頭文件
-d 輸出目錄
-classpath <path> 加載引用路徑
命令:
(1)進(jìn)入項(xiàng)目根目錄
(2)找到sdk/platforms/android-16/android.jar
(3)javah -classpath bin/classes ;../sdk/platforms/android-16/android.jar -d jni packeageName.className 生成jni文件目錄
javah -d jni -classpath F:\Android\Sdk\platforms\android-28\android.jar;....\build\intermediates\classes\debug com.sunql.ndkfrist.J
NITest
4.創(chuàng)建實(shí)體類.c 文件 ,引入生成的jni頭文件。
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_sunql_ndkfrist_JniLoader_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
5.引入Android.mk文件 ,加入編譯的文件配置。
build.gradle配置詳情展示:
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.sunql.ndkfrist"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
// 默認(rèn)是 “ cppFlags "" ”
// 如果要修改 Customize C++ Support 部分,可在這里加入
cppFlags "-frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } }
}
CMakeLists.txt配置文件如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(demo-lib
SHARED
src/main/cpp/demo-lib.cpp )
add_library(test-demo
SHARED
src/main/cpp/test-demo.cpp )
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries(demo-lib
${log-lib} )
target_link_libraries(test-demo
${log-lib} )
6.根目錄命令:ndk-build命令生成.so文件。使用android studio開發(fā)生成的.so文件會(huì)直接在build目錄下的intermediates\cmake\debug\obj\arm64-v8a目錄中。復(fù)制.so文件到其他項(xiàng)目的lib中就可以調(diào)用.so中的API方法了。

7.初始化jni類,調(diào)用完成。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JniLoader jniLoader=new JniLoader();
String string= jniLoader.stringFromJNI();
TextView textView=findViewById(R.id.textview);
if (!TextUtils.isEmpty(string)){
textView.setText(string);
}else {
textView.setText("獲取null");
}
}
}