本文开发工具基于 Android Studio 3.0.1
1. Android Studio NDK配置
NDK 下载(配置)如下图所示:
下载(配置)完成后在SDK目录下会有如下 ndk-bundle 文件夹,如下图:
2. JAVA及NDK环境变量配置
JAVA 环境变量配置:
新建 JAVA_HOME 环境变量,并配置: C:\Program Files\Java\jdk1.8.0_31
配置 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 ,出现如下表示配置成功。
NDK环境变量配置:
在系统环境变量 Path 下增加 ndk-bundle 路径:G:\sdk\sdk\ndk-bundle
检验 NDK 是否配置成功。在命令行输入 ndk-build 命令,出现如下表示配置成功。
3. 新建项目(New Project)并配置项目
在 Android Studio 中新建一个项目 JNITest1
1. 检查(配置) project 中的 local.properties ,是否有(添加):ndk.dir=G\:\\sdk\\sdk\\ndk-bundle (新建项目会默认添加)
2. 配置 project 中的 gradle.properties,添加:android.useDeprecatedNdk=true
3. 配置 app 中的 build.gradle,在 defaultConfig 中添加:
ndk {
moduleName "jnitest1"
}
moduleName 为最后生成的 *.so 文件名,最后会生成 libjnitest1.so 文件(增加了 lib 前缀)
4. 新建 Java 与 C 交互的Java接口类(如:TestJniInterface.java)
创建一个 TestJniInterface.java 类并定义一个方法 getJniName()
5. 根据Java接口类生成头文件(*.h 文件)
在命令行定位到 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_ ,包名和类名用 _ 分割)
6. 编写C/C++源文件(*.cpp 文件)
1. 在 main 目录下新建一个 jni 文件夹,并把刚刚生成的头文件 com_ljstudio_android_jnitest1_TestJniInterface.h 移动到 jni 文件夹下。
2. 在 jni 文件夹下创建 C/C++ 源文件 com_ljstudio_android_jnitest1_TestJniInterface.cpp 并编写代码 。
#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 方法。)
7. 打包成 *.so 文件
1. 在 jni 目录下新建 Android.mk 文件并编写 *.so 的生成规格
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
2. 在命令行定位到 jni 目录 ,并执行 ndk-build 命令,执行成功如下图。
3. 在 Android Studio 工程目录下会生成 libs 及 obj 二个文件夹
至此 *.so 文件生成成功,我们可以在 Android 项目中开心的用起来了。
8. Android 项目中使用 *.so 文件
1. 在 TestJniInterface.java 中添加
static {
System.loadLibrary("jnitest1");
}
2. 在 app 的 build.gradle 的 defaultConfig 中添加
sourceSets.main {
jniLibs.srcDir'src/main/libs'
jni.srcDirs = []
}
3. MainActivity中调用并运行,运行成功如下图
欢迎指正及赞赏!
:我的
掘金:我的掘金
CSDN:我的CSDN(待完善)
知乎:我的知乎(待完善)
GitHub:我的GitHub(待完善)