Android NDK 环境配置以及运行小案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013868143/article/details/82772080

最近有点时间,整理一下自己的总结先!!!!

首先要准备的东西:

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 <jni.h>
#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小案例完成。谢谢。

猜你喜欢

转载自blog.csdn.net/u013868143/article/details/82772080