1. 程式人生 > >Android Studio 配置NDK環境

Android Studio 配置NDK環境

Android開發中可以使用java+c的方式,使用c/c++開發在有的方面會提高效率和安全性。原來就簡單的用過jni開發,但是現在好久不用都忘得差不多了,現在從配置環境開始,一步一步記錄下來,算是鞏固,而且以後自己寫的程式會刻意的多使用。

第一步:配置NDK路徑

下載好NDK並安裝,在下載SDK時可以選擇下載NDK,這樣在下載SDK時就下載好了NDK;開啟設定介面,設定NDK路徑,見圖1:

image圖1.設定ndk路徑

第二步:配置gradle.properties

在該檔案中新增過時ndk版本支援:android.useDeprecatedNdk=true

第三步:配置module的build.gradle

    /*NDK配置*/
    ndk{
        moduleName "encryptLib"
        abiFilters "armeabi", "armeabi-v7a", "x86"
    }

第四步:建立java類宣告原生代碼庫,然後定義native方法

    /*宣告原生代碼庫*/
    static {
        System.loadLibrary("encryptLib");
    }
    /*宣告本地方法,獲得加密後字串*/
    public native String getEncryptString();

第五步:生成.h標頭檔案,你可以自己寫標頭檔案,只不過繁瑣而且容易出錯。(最後會給出定製巨集命令的方法)

(1)很多部落格裡面生成的.h檔案位置都不對,還需要複製貼上,其實可以通過命令一步到位的。

(2)開啟Terminal視窗,cd到app/src/main/java目錄;

(3)執行命令:

javah -encoding UTF-8 -d ../jni -jni 包名+類路徑

-encoding UTF-8: 指定編碼格式,否則有可能報編碼不對應的錯誤,-d ../jni :是在上一級目錄建立jni資料夾,而且讓生成的標頭檔案放在這個資料夾裡面,-jni 包名+類路徑:生成.h標頭檔案。
這裡寫圖片描述
image

第六步:編寫c++檔案

#include "com_wangliang160616_androidtest_activity_EncryptActivity.h"
JNIEXPORT jstring JNICALL Java_com_wangliang160616_androidtest_activity_EncryptActivity_getEncryptString1 (JNIEnv *env, jobject obj){ return env->NewStringUTF("Hello,JNI!"); }

第七步:最後,呼叫

    /*handle business*/
    public void handleBusiness() {
        encryptTv.setText(getEncryptString1());
    }

在make project後,在build/intermediate/jniLibs下生成了so檔案,將jniLibs資料夾拷貝到main目錄下,刪除剛剛建立的.h檔案,.cpp檔案。

最後,我們發現第五步生成.h標頭檔案太麻煩了,容易出錯,所以我們可以通過巨集命令的方法來替代。

(1)設定→External Tools
這裡寫圖片描述
image
(2)引數解釋
第一個:Program,相當於命令javah,所以這裡填寫javah.exe的路徑,我的路徑是:

$JDKPath$\bin\javah.exe

第二個:Parameters:

-encoding UTF-8 -d $ModuleFileDir$\src\main\jni -jni $FileClass$

第三個:Working directory:

$ModuleFileDir$\src\main\java

這一個相當於指定目錄:
D:\ASworkspace\AndroidTest2\app\src\main\java>

上面三個加起來就是:

D:\ASworkspace\AndroidTest2\app\src\main\java>
javah -encoding UTF-8 -d D:\ASworkspace\AndroidTest2\app\src\main\jni -jni com.wangliang160616.androidtest.activity.EncryptActivity

看看效果:
這裡寫圖片描述
image

好了,大功告成!