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、執行的我們的程式就能看到開始圖上的結果了
------------------------做一個快樂的小頑童------------------------