近日做Android項目,引用的第三方包需要依賴JNI。
特意在網上查了一下AndroidStudio如何導入.so文件,發現有很多不同的方式,有簡單的也要比較復雜的,而且有的方式還是錯誤的(說多了都是淚啊),為了避免很多人在第一次導入so浪費太多時間,在此教大家一種最簡單的導入方式。
大家使用過Eclipse的都知道,Eclipse中導入.so文件很簡單,根據支持的CPU框架直接放在/libs目錄下面就好了,項目打包時會直接就打包到了apk中。然而AndrodStudio這樣做卻不行,它只會把識別jar打包到apk中,而so文件就被遺忘在風中,這是為什么呢?
其實我們只要認真看看項目工程中的module下的build.gradle中的代碼我們就能明白,為什么libs中jar能被打包到apk中,而so文件卻不能。
compile fileTree(dir:'libs',include: ['*.jar']) 就是這句代碼申明了將項目中/libs下的jar一起打包到apk中。
那么問題來了,是不是我們把這個地方的 *.jar換成 */*.so (因為so文件有多種CPU支持,所以要在前面加上*/)就可以將so文件一起打包到apk中了呢?答案當然是不可以,因為這種方式僅支持jar類型。
其實要想將so文件打包到apk中,和上面的也差不多,只需要在build.gradle里面申明一下就好了。
在build.gradle中的android下面添加
sourceSets {
? ? main {
?? ? ? ?jniLibs.srcDirs= ['libs']
? ? }
}
這串代碼,就可以實現將module下libs中的so一起打包到apk中了。
sourceSets是Android打包時資源集,包含了很多目錄資源指向,如:src、libs、res等目錄都是在這里面指定了路徑,ide才會在編譯的時候去編譯路徑下面的資源代碼。
main就和我們java的class中的main方法一樣,是sourceSets的執行主入口方法。
jniLibs表示jni引用libs,.srcDirs用于指定路徑。
(以上內容純屬個人看法,有不對的地方望大家提出改正)