AS jni開發(fā)流程實例講解

已有工程使用已存在的so庫

注意 :不管動態(tài)注冊還是靜態(tài)注冊,jni里面的函數(shù)和java 類名包名都是一一對應(yīng)關(guān)系,兩個不同包名的工程或者兩個類無法使用同一個jni庫。同一個工程下面多個類都調(diào)用jni庫,可以采取輔助類或者輔助jar包的方式

添加so庫到項目

第一種方式 :將庫放置libs下面
由于Android Studio中,則會默認(rèn)匹配main下的jniLibs目錄,故如果將庫放在libs下面 需要在build.gradlel里面添加如下配置

android {
        ......
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                ......
            }
            ......
        }
        ......
    }

此時將so庫放到libs下面,在sync以下,AS就會自動生成jniLibs文件夾,并且有了放在libs下面的so庫


捕獲.PNG

第二種方式:手動創(chuàng)建jniLibs 文件夾,將庫手動放置jniLibs 下面
在指定位置新建jniLibs文件夾,注意大小寫
將so庫復(fù)制到j(luò)niLibs 文件夾下編譯即可


捕獲.PNG

如果要精簡通過so庫來減少安裝包的大小其實還可以通過動態(tài)選擇需要添加的.so庫
在App下的build.gradle中配置:

ndk {
            //選擇要添加的對應(yīng)cpu類型的.so庫。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

注意: libs 和 jniLibs是沖突的,so庫只能放在一處, 如果放在libs下面,并且指定 jniLibs.srcDirs = ['libs'], 那么手動放在jniLibs下面的庫將不會加載,所以兩邊都有時 需要合并

java代碼調(diào)用so庫

捕獲.PNG
  • 調(diào)用方法前 加載so庫
  • 聲明native方法
  • 調(diào)用native方法

已有工程NDK開發(fā)

方式一 新建module方式

優(yōu)點:輸出aar包,多個工程可以共用jni,不用jni注冊函數(shù)和調(diào)用函數(shù)包名類名一致,相當(dāng)于新建了輔助aar用于jni調(diào)用

新建->module->Android Native Library


捕獲.PNG

選擇完后AS工程會多出一個module


捕獲.PNG

build nativelib 在對應(yīng)build文件夾下面會生成aar包
捕獲.PNG
方式二 主項目中NDK開發(fā)

使用傳統(tǒng)jni目錄開發(fā)

  • File->new->Folder->JNI Folder
    切換到project模式會看到j(luò)ni文件夾,在jni文件夾下新建cpp、Android.mk


    image.png

    使用cmake開發(fā)

  • File->Add C++ to module


    捕獲.PNG

    選擇創(chuàng)建CmakeLists這個選項后AS自動生成cpp目錄如下


    捕獲.PNG

新工程NDK開發(fā)

新建 工程 選擇 native C++


捕獲.PNG

選擇完后 AS會自動生成CPP文件夾,里面包含 CMakeList 和 cpp 文件


捕獲.PNG

AndroidStudio更新到2.2,有了CMake和傳統(tǒng)JNI兩種開發(fā)NDK的方法,新建native工程只能得到cmake方式,要想jni開發(fā)方式,只能普通項目轉(zhuǎn)jni,具體參考:https://blog.csdn.net/chenhuakang/article/details/77364926

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容