由於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 中我命令沒有成功,可以到 dos 窗口中去執行命令是一樣的。但是需要到下圖的文件路徑下去執行 ndk-build)
----------------------------------------分割線--------------------------------------
下面就是對我們的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;然後在集合自己踩過的坑進行了補充修改。