1. 程式人生 > >NDK JNI開發配置以及Demo

NDK JNI開發配置以及Demo

NDK開發環境搭建—-AndroidStudio

本片文章用於講解windows下android studio 的NDK環境搭建以及Demo展示:


Android Studio搭建

開發軟體
1 NDK下載:https://developer.android.google.cn/ndk/downloads/index.html
2 Cygwin下載:https://cygwin.com/install.html

1. 配置ndk

1)配置NDK的環境變數(在系統環境變數中配置,不贅述):

2)開啟Android Studio(後面簡稱AS),依次點選File->Project Structure->SDK Location,到如下介面,選擇你的NDK所在的目錄,選擇完之後點選ok,就可以了:
這裡寫圖片描述

2. 配置使用Terminal(如果已經配置跳過)

 使用ctrl + alt +s開啟settings,然後操作setting->Tools->Terminal,配置cmd.exe這樣就可以在Terminal裡面做dos命令(後面用來生成jni檔案)。

3. 寫JniDemo

1) 首先在專案中新建一個類JniClient,如:

這裡寫圖片描述

這裡做一下講解,這個裡面有兩個靜態方法,都是用native修飾,意思表示是JniClient類裡面有兩個本地方法helloWord和calculate,但是這裡顯示的是紅色說明我們只是宣告,但是AS沒有找到這兩個方法。下面就來建立方法

2)建立玩JniClient類之後
  1. make 一下專案,AS會在在專案的app\build\intermediates\classes\debug\ zj\guyue\testjni 下建立JniClient.class位元組碼檔案,之後建立jni資料夾如下:
    這裡寫圖片描述
    這裡寫圖片描述

  2. 開啟AS命令列視窗(View->Tool Window->Terminal)。輸入如下命令:
    javah -d jni -classpath E:\5-ProjectFile\2-AndroidStudio\TestJNI\app\build\intermediates\classes\debug zj.guyue.testjni.JniClient


    可以在剛剛建立的jni資料夾下看到對應的.h檔案(生成的檔名稱規則:包名_ 類名.h,包名的點變成 _
    這裡寫圖片描述

3)建立c程式碼
  • 建立c檔案
    這裡寫圖片描述

  • 編寫C程式碼

#include <zj_guyue_testjni_JniClient.h>
JNIEXPORT jstring JNICALL Java_zj_guyue_testjni_JniClient_helloWord(JNIEnv *env, jclass obj){

     return (*env)->NewStringUTF(env,"guyuelan");
}

JNIEXPORT jint JNICALL Java_zj_guyue_testjni_JniClient_calculate(JNIEnv *env,jclass obj,jint a,jint b){
    return a + b;
}

這裡寫圖片描述

4)配置專案引數
  • 在gradle.properties 裡面加上:android.useDeprecatedNdk=true

  • 在gradle的defaultConfig裡面新增

    ndk{
            moduleName "JniClient"   // 生成的so檔名
            abiFilters "armeabi","x86","armeabi-v7a"  //CPU型別
        }
5)生成so檔案

專案引數配置好之後,直接rebuild一次,然後在專案的build目錄下就有對應的so檔案。
這裡寫圖片描述

這樣AS的JNI使用就OK了~,至於引用so檔案簡單的說下:將生成的3個型別的資料夾(含so檔案)拷貝到專案的libs資料夾下就可以直接引用了,看下呼叫結果。

這裡寫圖片描述

常見的錯誤解決辦法:

  • 報錯說“….找不到檔案”/…Not Found…——>你的NDK本身有問題重新下載一個
  • 報錯說: ….ndk.cmd….錯誤———->你在jni資料夾下新增一個空的empty.c檔案(為什麼這樣,我在網上找了很久,說是AS整合jni,不是很友好….目前也沒有明確,為什麼這麼說,你可以去你的jni資料夾下看看你寫的c檔案,即使編譯成功,生成so檔案,但是c檔案裡還是顯示紅色。)