Android studio 使用ndk開發JNI

今天寫JNI Demo搞了一天,其中遇到了許多錯誤,不過一一解決了,下面是我根據網上總結的開發過程:

0.配置ndk路徑

在project項目的local.properties裏面加上ndk路徑

ndk.dir=D\:\\NDK\\android-ndk-r11b


1.在project 下的gradle.properties,裏面加上:

android.useDeprecatedNdk=true


2.在app 的build.gradle的

defaultConfig裏面加入
ndk {
    moduleName "JniTest"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

moduleName 就是so庫的庫名。第二行打印log,第三行是支持的體系架構,完整如下


3.我們寫本地方法(可以單獨創建類,也可以直接在已有的類裏面寫),



4.調用本地方法,然後build項目(我此處,點擊button,改變textview的文本),你會在 項目名\app\build\intermediates\classes\debug\(項目包名) 下找到生成的class文件


5.最重要的一步:打開as 的terminal,進入 項目名\app的main目錄下,輸入:

javah -d jni -classpath <SDK_android.jar>;<APP_classes>   education.bbk.com.myapplication.TestJJ

我的是:


此時你會發下生成了.h文件



6.創建main.c文件(文件命任意),打開.h文件,我們複製方法名過來,寫好的如下,我們再次build


* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

/* Header for class lab_sodino_jnitest_MainActivity */

#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: lab_sodino_jnitest_MainActivity
 * Method: getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_education_bbk_com_myapplication_TestJJ_getString
  (JNIEnv * env, jobject jObj){
      LOGE("log string from ndk.");
      return (*env)->NewStringUTF(env,"Hello From JNI!");
  }

#ifdef __cplusplus
}
#endif
#endif

7.buid後,我們發現已經生成了so包,然後在代碼中加載庫:

static {
    System.loadLibrary("JniTest");
}


  

8.運行項目,點擊按鈕,c代碼成功調用

 


9.大家有什麼疑問,歡迎討論


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