本文開發工具基於 Android Studio 3.0.1java
NDK 下載(配置)以下圖所示:android
下載(配置)完成後在SDK目錄下會有以下 ndk-bundle 文件夾,以下圖:c++
新建 JAVA_HOME 環境變量,並配置: C:\Program Files\Java\jdk1.8.0_31app
配置 Path 環境變量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin工具
配置 CLASSPATH 環境變量:.;%JAVA_HOME%\lib (或更加精確的配置 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar)開發工具
檢查 JAVA 環境變量是否配置成功,在命令行輸入 java -version ,出現以下表示配置成功。gradle
在系統環境變量 Path 下增長 ndk-bundle 路徑:G:\sdk\sdk\ndk-bundleui
檢驗 NDK 是否配置成功。在命令行輸入 ndk-build 命令,出現以下表示配置成功。命令行
在 Android Studio 中新建一個項目 JNITest13d
ndk {
moduleName "jnitest1"
}
moduleName 爲最後生成的 *.so 文件名,最後會生成 libjnitest1.so 文件(增長了 lib 前綴)
建立一個 TestJniInterface.java 類並定義一個方法 getJniName()
在命令行定位到 TestJniInterface.java 所在的 java 文件夾路徑 : F:\AndroidStudioProject\JNITest1\app\src\main\java
執行命令 javah com.ljstudio.android.jnitest1.TestJniInterface
執行完成後會在所在的 java 文件夾生成 .h 的頭文件 com_ljstudio_android_jnitest1_TestJniInterface.h
(JNI 取名規則爲包名 + 類名,JNI 方法會在前面加上了 Java_ ,包名和類名用 _ 分割)
#include "com_ljstudio_android_jnitest1_TestJniInterface.h"
JNIEXPORT jstring JNICALL Java_com_ljstudio_android_jnitest1_TestJniInterface_getJniName
(JNIEnv *env, jclass) {
return env -> NewStringUTF("Say hello from JNI!");
}
(Java 的 String 類型 轉換成了 C/C++ 中的 jstring,並用到 jni 中的 NewStringUTF 方法。)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnitest1
LOCAL_SRC_FILES := com_ljstudio_android_jnitest1_TestJniInterface.cpp
include $(BUILD_SHARED_LIBRARY)
默認生成全部平臺下的 *.so 文件。
也可在指定相應平臺,jni 文件夾下新建 Application.mk 文件編寫規則:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := armeabi-v7a
APP_PLATFORM := android-21
至此 *.so 文件生成成功,咱們能夠在 Android 項目中開心的用起來了。
static {
System.loadLibrary("jnitest1");
}
sourceSets.main {
jniLibs.srcDir'src/main/libs'
jni.srcDirs = []
}
簡書:個人簡書
掘金:個人掘金
CSDN:個人CSDN(待完善)
知乎:個人知乎(待完善)
GitHub:個人GitHub(待完善)