由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。VM在Android平台里,扮演很重要的角色。
1.先建一个NdkJniDemo的工程
2.新建JniUtils类实现native方法
public class JniUtils { public static native String getStringFormC();
}
3.如图操作:
4.然后 clean project 在 rebuild project 生成 class 文件;这时候打开如下图的文件夹看是否生成了 classes 文件夹,没有生成请重新来过。如下图:
5.再打开 Terminal 输入指令(其实在 Terminal 我命令没有执行成功,我是直接在 dos 中去执行的命令。)
cd app/build/intermediates/classes/debug
然后在输入指令
javah -jni com.wobiancao.ndkjnidemo.ndk.JniUtils
注意 这里的 javah -jni 后面跟的是 JniUtils 类的全路径,如果 javah 报不存在之类的,是你的 java 环境没有配置好。( 也可以在 dos 命令窗口来执行上面的命令)
6.这时候打开 classes/debug 下面的文件发现多了一个文件
com_wobiancao_ndkjnidemo_ndk_JniUtils.h
然后在 src/main 下新建文件夹 jni,把生成的 .h 文件复制或者剪切到 jni 文件夹下面去,新建一个 c 类随便取一个名字,添加代码如下:
Created by XY on 16/1/4.//#include "com_wobiancao_ndkjnidemo_ndk_JniUtils.h"/*
* Class: Java_com_wobiancao_ndkjnidemo_ndk_JniUtils
* Method: getStringFormC
* Signature: ()Ljava/lang/String;
*/JNIEXPORT jstring JNICALL Java_com_wobiancao_ndkjnidemo_ndk_JniUtils_getStringFormC
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"这里是来自c的string"); 注意这里的方法名要求和第二步中类的方法名一直,不然会报错
这里发现头文件 #include<jni.h>报红色,是因为咱们还没有配置 ndk 环境,打开 file->project structure 选择你所下载的 ndk 环境路径,如果没有 ndk 这里有个地址大家可以去下载 一个安卓工具集合的网站:http://androiddevtools.cn/
7.我们要在 jni 目录下创建 Android.mk 和 Application.mk 文件
Android.mk文件内容为
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := app
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)
Application.mk内容为(这个配置是为了生成所有平台的so库,若不配置只会生成armeabi目录下的)
APP_ABI := all
8.配置 Gradle
在defaultConfig下,配置ndk:
ndk {
moduleName "app" // 生成的so名字
}
在android标签内配置sourceSets:
注意:这里也有坑
若此处没设置会报[Execution failed for task ':app:compileDebugNdk']这个错误
sourceSets.main {
jni.srcDirs = ['libs']
}
9.生成的 so 文件都在 src/main/libs 目录下:
在 Terminal 下执行 ndk-build
(其实 Terminal 中我命令没有成功,可以到 dos 窗口中去执行命令是一样的。但是需要到下图的文件路径下去执行 ndk-build)
11.
截止到目前我们的.so库就全部生成了
----------------------------------------分割线--------------------------------------
下面就是对我们的so的使用了
1、在main文件中创建jniLibs 将我们的libs下的so文件拷贝到下面去
2、在JniUtils类中添加代码块
static {
System.loadLibrary("app"); //defaultConfig.ndk.moduleName
}
3、运行的我们的程序就能看到开始图上的结果了
----------------------------------------分割线--------------------------------------
在加上 NDK 环境变量的配置和验证:
1、首先是要配置NDK(若是已经配置过NDK请略过此步骤)
官网下载NDK地址(此地址下载需要翻墙)
若是你翻不了墙请移步至
一个强大的下载网站(Androiddevtools你值得拥有)
下载好之后是个压缩包,应该做什么你应该知道了,然后下面进行第二步
2、配置环境变量
创建NDK_HOME
(我按照下图步骤对 ndk 的环境变量进行了配置,但是不行。最后我直接在 path 路径中添加 ndk 的路径 D:\android-ndk-r13b-windows-x86_64\android-ndk-r13b ,却可以执行命令)
再将配置好的NDK_HOME添加到PATH环境变量中
配置好之后可以测试是否配置正确 ,打开cmd在里面输入ndk-build
出现上述结果就说明ndk环境变量已经设置成功了,提示信息是因为没有定义NDK_PROJECT_PATH变量,此处用不到,我们暂不处理
----------------------------------------分割线--------------------------------------
上面方法步骤主要是参照这两篇博客:
http://www.open-open.com/lib/view/open1451917048573.html
http://www.jianshu.com/p/5fc674ee4810;然后在集合自己踩过的坑进行了补充修改。