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學習過程,有什麼問題或者指點,可以隨時在下面評論或者私聊我,謝謝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章