1. 程式人生 > >Android studio 簡單方便的使用JNI呼叫c語言中的方法

Android studio 簡單方便的使用JNI呼叫c語言中的方法

今天嘗試了在Android studio中呼叫JNI,歷盡千辛萬苦終於成功了。不說廢話,只談步驟:

第一步:在gradle.properties檔案中新增  Android.useDeprecatedNdk = true


第二步:將滑鼠游標移到你的專案上按f4,選中SDK Location,這一步的是新增NDK,一般來說在最下面的NDK location是沒有的,點選旁邊的下載就可以等他下載安裝。


第三步:NDK環境配置(自行百度),配置成功後,如下圖所示,只要不是提示“未知命令”就說明配置成功了


第四步:寫一個native方法,等下要用到的,然後rebuild project在java目錄下面就會有一個.h檔案生成。


第五步:build的配置,注意這裡的moduleName要和MainActivity裡面的一致,這個是等下生成的so檔案的名字


第六步:在main目錄下新建jni目錄,把第四步生成的.h檔案剪下到這裡來,同時也建立下面的一些檔案

Android.mk程式碼如下:

LOCAL_PATH := $(call my-dir)   
include $(CLEAR_VARS)

LOCAL_MODULE    := JniTest   和build.gradle裡面的一致
LOCAL_SRC_FILES := main.c    你需要呼叫的c檔案

include $(BUILD_SHARED_LIBRARY)

Application.mk程式碼如下:

APP_CFLAGS += -Wno-error=format-security
APP_ABI := armeabi    規定只生成這樣的檔案

.h檔案如下:紅色字型改成自己的就可以,格式是:java_包名—類—方法名(注意:這個.h檔案是自動生成的,我的自動生成的java的j是大寫,但是出錯了,改成小寫就可以了,不行的話照著這個來吧)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnic_MainActivity */
#ifndef _Included_com_example_jnic_MainActivity #define _Included_com_example_jnic_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jnic_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL
java_com_example_jnic_MainActivity_getStringFromNative (JNIEnv * env, jobject* obj){ return (*env)->NewStringUTF(env,"終於可以了!"); } #ifdef __cplusplus } #endif #endif
.c檔案如下:下面的紅色地方開頭必須大寫,注意了。這裡的方法是和.h裡一樣的(不行照著來)
#include "com_example_jnic_MainActivity.h"
JNIEXPORT jstring JNICALL  Java_com_example_jnic_MainActivity_getStringFromNative (JNIEnv * env, jobject obj){
 return (*env)->NewStringUTF(env,"終於可以了");
}
到這裡準備工作做完了,接下來就是重點了:拿到我們的so檔案,

第七步:生成so檔案,到你的專案目錄下,執行 ndk-build,就會出現下面的

然後在你的目錄工程結構下就會出現一個Libs,如下圖:


這個時候你在main目錄下新建一個jniLibs資料夾,把lib下面的檔案整個複製到jniLibs下面,這個時候編譯執行就OK了,有一點需要特別注意,如果你想改變輸出的值,你就的重新在生成so檔案,覆蓋之前jniLibs下面的,在編譯執行,就會得到你想要的結果了。

以上是我的JNI學習過程,有什麼問題或者指點,可以隨時在下面評論或者私聊我,謝謝。