1. 程式人生 > >Android studio執行JNI程式以及生成.so檔案(Windows下)

Android studio執行JNI程式以及生成.so檔案(Windows下)

呼叫JNI中的方法展示出來的結果


生成的各個平臺的so庫的結果


下面開始進入主題
1、首先是要配置NDK(若是已經配置過NDK請略過此步驟)

建立NDK_HOME


再將配置好的NDK_HOME新增到PATH環境變數中


配置好之後可以測試是否配置正確 ,開啟cmd在裡面輸入ndk-build


出現上述結果就說明ndk環境變數已經設定成功了,提示資訊是因為沒有定義NDK_PROJECT_PATH變數,此處用不到,我們暫不處理
3、開始對Android Studio進行NDK環境配置


設定完畢之後,我們的準備工作就結束了,下面就是程式猿最喜歡的事情---寫程式碼了
編碼階段
1、現在AS中建立一個新的工程,然後建立一個新的類JNIUtils

package com.tiancb.ndktest;
/**
* Created by tiancb on 2016-7-21 14:41.
*/
public class JniUtils {
public  native String getStringFormC();
}

然後clean project 再rebuild project 生成class檔案,這時候開啟如下圖的資料夾看是否生成了classes資料夾,沒有生成請重新來過。

2、開啟Tirminal cd到 build\intermediates\classes\debug這個目錄下
javah -classpath . -jni com.tiancb.ndktest.JniUtils
注意:此處有坑


網上很多人輸入的命令是javah -jni com.tiancb.ndktest.JniUtils,我開始也是輸入的這個
但是輸入之後會報錯 錯誤: 找不到 'com.tiancb.ndktest.JniUtils' 的類檔案。但是明明是有能看到這個類的

後來發現是因為我使用的Android Studio 版本是2.1.2,javah這個命令在android studio2.0之後要用加-classpath

執行完之後你就會看到build\intermediates\classes\debug目錄下多了一個com_tiancb_ndktest_JniUtils.h檔案
3、在main目錄中建立一個jni目錄,



將前面的com_tiancb_ndktest_JniUtils.h檔案剪下到新建的 jni目錄下,然後再建立一個檔案命名為jnitest.c
編輯內容如下

#include "com_tiancb_ndktest_JniUtils.h"/* * 
Class:     io_github_yanbober_ndkapplication_NdkJniUtils
 * Method:    getCLanguageString 
* Signature: ()Ljava/lang/String; 
*/JNIEXPORT jstring JNICALL Java_com_tiancb_ndktest_JniUtils_getStringFormC  (JNIEnv *env, jobject obj){     
    return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!"); 
 }

4、接下來我們要在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

5、配置Gradle
在defaultConfig下,配置ndk:

ndk {
   moduleName "app" // 生成的so名字 
}

在android標籤內配置sourceSets:
注意:這裡也有坑
若此處沒設定會報[Execution failed for task ':app:compileDebugNdk']這個錯誤

sourceSets.main {   
   jni.srcDirs = ['libs']
}

生成的so檔案都在src/main/libs目錄下。
在Terminal下執行 ndk-build



截止到目前我們的.so庫就全部生成了
----------------------------------------分割線--------------------------------------
下面就是對我們的so的使用了

1、在main檔案中建立jniLibs 將我們的libs下的so檔案拷貝到下面去
2、在JniUtils類中新增程式碼塊

static {   
   System.loadLibrary("app");   //defaultConfig.ndk.moduleName
}

3、執行的我們的程式就能看到開始圖上的結果了

------------------------做一個快樂的小頑童------------------------