Android NDK JNI 簡單調試 demo

Java Native Interface (JNI)標準是java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI 是本地編程接口,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和彙編語言)編寫的應用程序和庫進行交互操作。
由於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;然後在集合自己踩過的坑進行了補充修改。

發佈了39 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章