1.開發(fā)編譯環(huán)境
AndroidStudio 2.1.2
SDK 23.0.3
NDK 12.1.2977051
2.NDK的安裝與配置
首先創(chuàng)建一個Android項目工程诫龙,F(xiàn)ile-->New-->New Project铺峭,一路下一步就好,最后finish創(chuàng)建完成項目.
打開Project Structure民假,默認Android NDK location是沒有的开泽,這時候如果已經(jīng)下載有了NDK廓鞠,那你就可以直接選擇下載好的NDK路徑設置到輸入框,否則點擊download進行下載怎囚,下載完成后默認安裝在sdk根目錄卿叽,命名為ndk-bundle。
我的sdk路徑為:/Users/serenitynanian/Library/Android/sdk
2.1 添加系統(tǒng)環(huán)境變量恳守,新建變量名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方法的創(chuàng)建
3.1 在java目錄下的包中創(chuàng)建一個Hello類丸卷,類里面創(chuàng)建一個native方法枕稀,如下:
/**
* 由于當前版本的as暫時不支持c文件的連接和根據(jù)提示自動創(chuàng)建c方法,只有手動添加
* 添加規(guī)則如下:
* 來到terminal終端上谜嫉,在app/java/目錄下 輸入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
* 那么會在java的上級目錄也就是main目錄下創(chuàng)建一個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內(nèi)容如下:
/* 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的實現(xiàn)
#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是實現(xiàn)的方法名食铐,固定格式,Java_所要實現(xiàn)的方法名所在java類僧鲁,將類的包名中的.用下劃線替代_方法名(JNI環(huán)境變量 env,JNI環(huán)境對象 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類中添加一個靜態(tài)代碼塊,如下:
package com.zcbl.client.zcblsdk;
/**
* Created by serenitynanian on 2018/1/20.
*/
public class Hello {
static {
System.loadLibrary("hello");
}
/**
* 由于當前版本的as暫時不支持c文件的連接和根據(jù)提示自動創(chuàng)建c方法忽孽,只有手動添加
* 添加規(guī)則如下:
* 來到terminal終端上绑改,在app/java/目錄下 輸入 javah -d ../jni com.zcbl.client.zcblsdk.Hello 按下Enter
* 那么會在java的上級目錄也就是main目錄下創(chuàng)建一個jni的文件夾谢床,在文件夾下生成一個com_zcbl_client_zcblsdk_Hello.h
* 的頭文件;或者手動創(chuàng)建厘线;
* 上面的com.zcbl.client.zcblsdk.Hello是native類中的全路徑
* @return
*/
public static native String sayHello();
}
4.2 在java方法中調(diào)用识腿,如下:
Hello.sayHello()
上面就會調(diào)用native的方法;