Android studio 整合ndk環境,生成so庫,並在其他專案上引用

跋涉者901214發表於2017-11-21
    1.

生成so庫

首先 as的安裝這裡就不介紹了 版本3.0,新啟動一個專案 正式跑通 hello world 開始整合ndk環境。

第一步:

這裡寫圖片描述

第二步:
這裡說明一下 看下圖,是引用ndk的目錄 ,有的小夥伴在下載sdk的時候 會把ndk也一併下載了,如果ndk版本是r9以下版本(不包括r9) 那麼可能會導致編譯so庫失敗,所以為了避免麻煩 ,我下載了一個R12的版本,

這裡寫圖片描述

這裡寫圖片描述
並在as中指定一下目錄,其實這個ndk的目錄是自動生成的 只需要在下面選中一下目錄 上圖的這個目錄會自動匹配,

這裡寫圖片描述

第三步:
在工程目錄的gradle-properties最後一行,加上這句話 android.useDeprecatedNdk=true
這裡寫圖片描述

至此,ndk環境的搭建基本完成,下面開始寫內容:

首先 在本地新建一個NdkText類(English不好,命名略過。。。)

static {
        System.loadLibrary("wangh");
    }
    //java調C中的方法都需要用native宣告且方法名必須和c的方法名一樣
    public static native String getString();

初次編寫這個方法是報錯的 不用理會

第四步:
make 一下。
這裡寫圖片描述

這步操作過後 會在 這個目錄生成一個.class檔案

這裡寫圖片描述

第五步;
用javah 命令生成.h檔案 這個可用as自帶的teminal來完成
首先 命令進入到main目錄下 用javah 來生成.h 資料夾
javah -d jni -classpath F:\workspace\MyNdkApplication\app\build\intermediates\classes\debug com.wangh.myndkapplication.jnitext.JniText classpath後面有空格 build後面有空格 這裡要注意 是絕對路徑,你可以右鍵點選JniText.class copy the path 然後改一下 改成上面的樣子,

這裡寫圖片描述

第六步:

這個操作之後 會在main目錄下生成一個jni資料夾 裡面是一個.h 檔案, 這個檔案不做修改, 在jni資料夾也就是.h檔案的同級目錄,新建一個.c的檔案 命名隨意

這裡寫圖片描述

.C 檔案要引入.h的檔案頭, 和方法名,
//
// Created by Administrator on 2017/11/20.
//

#include "com_wangh_myndkapplication_jnitext_JniText.h"

JNIEXPORT jstring JNICALL Java_com_wangh_myndkapplication_jnitext_JniText_getString
        (JNIEnv *env, jobject jobject1){
    return (*env)->NewStringUTF(env,"Hello Jni Wangh !!!");
}

檔案頭就是.h檔案的檔名稱, 方法名可以拷貝.h檔案裡的方法名 稍作修改(新增上引數 和返回值,對C++程式碼不懂 照著這個寫就可以了 ^_^)

第七步:
萬事俱備 只欠配置,app model下,build-gradle

這裡寫圖片描述

moduleName 生成so的名稱
abiFilters 指定CPU型別,這裡只輸出三種

到這裡就大功告成了。rebuild一下, 編譯成功的話 會在app下build資料夾裡生成so檔案

這裡寫圖片描述

這個就是我們可能會在其他專案中用到的so庫

2. 引用so庫

至於so庫在其他專案中的引用 本人也只是試用了一下,如果有更好的引用方式望留言告知。感激不盡!

這裡寫圖片描述

要在com目錄下建立和之前的專案同樣的包名路徑,將JniText類複製過來,將so對應CPU型號依次複製到main下jniLibs裡面。(這裡經驗少的可能會把同一個so複製到不同cpu型別裡 一定要分別複製 不然生成不同的so就沒有什麼意義了) 這樣就完成了so在其他專案的使用。

如有問題請留言 文章有問題望指正 多謝!!!!!!!!!!!!!!!

相關文章