Android JNI之執(zhí)杖生涯 .a -> .so(gradle方式)(android studio)

連載

又見(jiàn)一簾幽夢(mèng),jni .a的故事還在繼續(xù)。原本打算跟 mk方式 一起,名字都想好了,大道三千,我只取二瓢。燃,故事開(kāi)始。

gradle-experimental

故事的豬腳。一個(gè)插件,專門為 JNI 服務(wù)。E文好的同學(xué),大體也猜出來(lái)了,這個(gè)是谷狗實(shí)驗(yàn)室里邊的玩意。東西,是好東西,就是實(shí)驗(yàn)二字,呵呵呵呵。純粹的gradle方式,取代mk,構(gòu)建一體化,夢(mèng)想是美好的。但,但谷歌似乎沒(méi)怎么放心上。閑話不多說(shuō),欲修煉此功,需注意幾點(diǎn)。

注1. 項(xiàng)目 gradle 依賴

對(duì)于 gradle-experimental, 我是滿頭欣喜的。一體化,純粹的gradle,讓我不得不欣賞。一見(jiàn)鐘情,再而衰,三而竭。手起刀落,一個(gè)配置的更換,讓我走上了渡劫之路。配置如下:

buildscript {
    ...
    dependencies {
          /**
         * 從前 classpath 'com.android.tools.build:gradle:2.2.3'
         * 由于插件的更換,蝴蝶來(lái)到了太平洋,一系列隨之而來(lái)
         */
        classpath 'com.android.tools.build:gradle-experimental:0.9.3'
    }
}

注2. 當(dāng)前app module配置

自己的決定,站起來(lái)就是擼。app module,作為渡劫場(chǎng)所,緊張刺激的準(zhǔn)備工作馬上就要開(kāi)始了。你看:
app應(yīng)用插件調(diào)整,

//從前, apply plugin: 'com.android.application' 
apply plugin: 'com.android.model.application'

由于加持了 model 插件, 渡劫被限制在作用域 model 中,氣場(chǎng)就是不一樣, 穩(wěn)了。見(jiàn)識(shí)見(jiàn)識(shí):

model{ 
    ...
    android{
    }
}

渡劫,要有渡劫的樣子,以前的配置,自然得有個(gè)小增強(qiáng)。瞧,幾顆栗子:

model{ 
    ...
    android{
      ...
      defaultConfig {
            ···
            //從前車馬慢,minSdkVersion 19
            minSdkVersion.apiLevel 9
            targetSdkVersion.apiLevel 19
        }
    }
}

注3. 核心配置

渡劫路上,需要依賴于.a靜態(tài)庫(kù),成就so。首先定義對(duì)于庫(kù)的repositories,用來(lái)指定庫(kù)的基本信息,包括庫(kù)文件的路徑,頭文件的路徑以及鏈接的方式等,詳見(jiàn)如下代碼:

model {
    ...
    repositories {
        libs(PrebuiltLibraries) {
            libHello {
                // 頭文件地址
                headers.srcDir "src/main/jni/sources/"
                // 靜態(tài)鏈接庫(kù)的引用,
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/sources/${targetPlatform.getName()}/libHello.a")
                }
            }
        }
    }
}

渡劫,成功的關(guān)鍵 —— NDK 配置,然后gradle一下,渡劫開(kāi)始。NDK配置已經(jīng)多有熟悉,但這里又有少許區(qū)別 。詳情吐下:

model{
  ...
  android{
     ...
     ndk {
            moduleName "JniDemo"
            //書信很遠(yuǎn), cppFlags "-std=c++11"
            cppFlags.add("-std=c++11") //c++版本
            stl "gnustl_static" //支持 stl 標(biāo)準(zhǔn)庫(kù)
            // 配置可多個(gè), abiFilters "armeabi", "armeabi-v7a", "x86"
            // abiFilters.addAll(['armeabi', 'armeabi-v7a', 'x86'])
        }
  }
}

結(jié)語(yǔ)

到這,已經(jīng)在渡劫路上越走越遠(yuǎn)了。對(duì)于 mk, gradle-experimental,本來(lái)想做個(gè)對(duì)比的。后面想想,各有千秋,都是基于 NDK build。至于選擇如何,暫且不提,各有所好罷了。期待下一次的相遇,下一次的精彩。
附送一張github機(jī)票,帶你領(lǐng)略世界的浩瀚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容