1.开发编译环境
AndroidStudio 2.1.2
SDK 23.0.3
NDK 12.1.2977051
2.NDK的安装与配置
首先创建一个Android项目工程,File-->New-->New Project,一路下一步就好,最后finish创建完成项目.
打开Project Structure,默认Android NDK location是没有的,这时候如果已经下载有了NDK,那你就可以直接选择下载好的NDK路径设置到输入框,否则点击download进行下载,下载完成后默认安装在sdk根目录,命名为ndk-bundle。
我的sdk路径为:/Users/serenitynanian/Library/Android/sdk
2.1 添加系统环境变量,新建变量名ANDROID_NDK_HOME,对应变量值为ndk根目录地址 ,如D:\android-sdk\ndk-bundle,然后将ANDROID_NDK_HOME添加到Path中去(%ANDROID_NDK_HOME%;),确定OK.
至此,会在项目的local.properties文件下添加ndk的目录地址,如果没有自动添加,可以收到加上一行:ndk.dir=/Users/serenitynanian/Library/Android/sdk/ndk-bundle,由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties文件下添加一行:android.useDeprecatedNdk=true.到此,NDK的安装和配置就完成.
3.Native方法的创建
3.1 在java目录下的包中创建一个Hello类,类里面创建一个native方法,如下:
/**
* 由于当前版本的as暂时不支持c文件的连接和根据提示自动创建c方法,只有手动添加
* 添加规则如下:
* 来到terminal终端上,在app/java/目录下 输入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
* 那么会在java的上级目录也就是main目录下创建一个jni的文件夹,在文件夹下生成一个com_zcbl_client_zcblsdk_Hello.h
* 的头文件;
* 上面的com.zcbl.client.zcblsdk.Hello是native类中的全路径
* @return
*/
public static native String sayHello();
3.2 在jni目录里生成的com_zcbl_client_zcblsdk_Hello.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zcbl_client_zcblsdk_Hello */
#ifndef _Included_com_zcbl_client_zcblsdk_Hello
#define _Included_com_zcbl_client_zcblsdk_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zcbl_client_zcblsdk_Hello
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zcbl_client_zcblsdk_Hello_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.3 com_zcbl_client_zcblsdk_Hello的实现
#include "com_zcbl_client_zcblsdk_Hello.h"
JNIEXPORT jstring JNICALL Java_com_zcbl_client_zcblsdk_Hello_sayHello
(JNIEnv * env, jclass jclass1){
return env->NewStringUTF(" from native c");
}
jstring:返回值类型;
Java_com_zcbl_client_zcblsdk_Hello_sayHello是实现的方法名,固定格式,Java_所要实现的方法名所在java类,将类的包名中的.用下划线替代_方法名(JNI环境变量 env,JNI环境对象 jobj);
3.4 Gradle配置,在app/build.gradle中加入你ndk 的moduleName,也就是生成.so的名字;
defaultConfig {
ndk{
//生成.so的名字 这个名字与native方法名没有关系
moduleName "hello"
}
}
如上配置,然后编译,就会在app/build/intermediates/ndk/debug/lib目录下生成对应abi的.so文件
四、在类中使用native方法
4.1 首先需要在native类中添加一个静态代码块,如下:
package com.zcbl.client.zcblsdk;
/**
* Created by serenitynanian on 2018/1/20.
*/
public class Hello {
static {
System.loadLibrary("hello");
}
/**
* 由于当前版本的as暂时不支持c文件的连接和根据提示自动创建c方法,只有手动添加
* 添加规则如下:
* 来到terminal终端上,在app/java/目录下 输入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
* 那么会在java的上级目录也就是main目录下创建一个jni的文件夹,在文件夹下生成一个com_zcbl_client_zcblsdk_Hello.h
* 的头文件;或者手动创建;
* 上面的com.zcbl.client.zcblsdk.Hello是native类中的全路径
* @return
*/
public static native String sayHello();
}
4.2 在java方法中调用,如下:
Hello.sayHello()
上面就会调用native的方法;