最近有点时间,整理一下自己的总结先!!!!
首先要准备的东西:
1.下载NDK,解压下载的NDK压缩包,解压路径为为: Android Studio的SDK目录里,并命名为ndk-bundle。
2.打开Android Studio(若已经打开了Android Studio,需要重启Android Studio)。
注:若配置一切正常,项目的local.properties中的文件将会显示ndk.dri=....等路径样式,如图:
3.配置ndk-build 点击file--setting--》Tools选项-》External Tools 进入如下界面,按照如下界面的信息去配置
Program是ndk的路径; Working directory是指你当前项目的main路径,配置好后,点击ok-》apply-》OK
4.再次配置NDK环境在build.gradle里面继续配置,并且对gradle.properties进行配置对旧版本的的NDK进行支持
其中moduleName就是生成.so文件的名称,abiFilters就是生成的CPU型号平台,ldLibs是日志打印。
#对旧版本的NDK支持 在gradle.properties里面添加如下一句话
android.useDeprecatedNdk=true
5.布局文件 activity_main.xml 里面包含一个TextView(id:tvText)和Button(id:btnNative)
6.Java代码 分为MainActivity 和 JNIUtils
MainActivity:包含控件的初始化以及Button的监听事件)
JNIUtils:包含与C++库的引用以及方法的声明
7.在项目的main文件夹里面新建一个文件名为jni,里面包含Android.mk,Application.mk,名称构成为 包名_JNIUtils的.h头文件以及test.cpp的C/C++语言文件。注意:包名中的“.”需要转变为“_”下划线进行区别,若包名含有下划线,那么下划线就改为“_1”!
7.1 .h的头文件
#include
#ifndef MYNDKPROJECT_COM_EXAMPLE_testDemo_MYNDKPROJECT_JNIUTILS_H
#define MYNDKPROJECT_COM_EXAMPLE_testDemo_MYNDKPROJECT_JNIUTILS_H
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_example_testDemo_myndkproject_JNIUtils_helloFromJNI(JNIEnv *,jclass);
#ifdef __cplusplus
}
#endif
#endif //MYNDKPROJECT_COM_EXAMPLE_testDemo_MYNDKPROJECT_JNIUTILS_H
其中.h只是进行声明函数(方法),方法名为helloFromJNI,这个方法将会是Android调用的方法,也就是JNIUtils里面的native的helloFromJNI方法,记住方法名一定要一致!!
7.2 test.cpp的内容
#include "com_example_testDemo_myndkproject_JNIUtils.h"
JNIEXPORT jstring JNICALL Java_com_example_testDemo_myndkproject_JNIUtils_helloFromJNI(JNIEnv * env,jclass object) {
return env->NewStringUTF("Hello I am from JNI !");
}
在test.cpp里面,进行include之前所写的.h头文件,方法为hellpFromJNI,里面使用了env->NewstringUTF("字符串xxx");来返回字符串。Java_com_example_testDemo_myndkproject_JNIUtils_helloFromJNI这个方法名称的Java必须要这么写,J一定要大写!
7.3.Application.mk的内容
APP_ABI := armeabi-v7a x86
#最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
#常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
#默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
#指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件
7.4.Android.mk的内容
LOCAL_PATH := $(call my-dir)
#设置工作目录,而my-dir则会返回Android.mk文件所在的目录
include $(CLEAR_VARS)
#清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
LOCAL_MODULE := hello_jni
#设置模块的名称,即编译出来.so文件名
#注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES := test.cpp
#指定参与模块编译的C/C++源文件名
include $(BUILD_SHARED_LIBRARY)
#指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
8.使用ndk-bundle编译jni文件夹里面的内容
选择jni文件夹,点击右键, 出现External Tools ->ndk-bundle ,选择进行编译,编译成功后,若没有显示错误,那么编译成功,去查看目录,发现多了一个名为obj的文件夹,进入obj文件夹,进入local,出现刚刚两个CPU的平台的.so文件。
9.复制.so文件
到这一步就差不多了,将obj里面的local文件夹里面的文件夹及文件全部复制到app层的lib包下,并且将平台文件夹里面的除.so文件之外全部删除。
10.运行
到此,整个NDK小案例完成。谢谢。