原文地址:
http://www.reibang.com/p/d784f4596420
http://blog.csdn.net/qq_24889075/article/details/70183861
記錄一天的苦逼啸胧,謹(jǐn)防再犯
方法一
由于項(xiàng)目需要使用到一個(gè)so庫(kù),于是開始加載so庫(kù),很普通的很常見的方式:
就是在Module的build.gradle中的android{}中添加如下代碼,然后將so文件放在libs目錄 即可
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
加的很完美,因?yàn)?strong>jniLibs已經(jīng)出現(xiàn)了,證明已經(jīng)加進(jìn)去了~ (在剛開始用AS的時(shí)候,網(wǎng)上有很多加so庫(kù)的方式急但,有真有假 很多人連測(cè)都沒測(cè)就發(fā)文章。記得看jniLibs是比較有效的方式搞乏,一直用到現(xiàn)在)
美美的運(yùn)行下程序波桩,報(bào)了一些錯(cuò)。大概意思就是沒有找到static的Native方法请敦,苦苦想了好久也沒想明白镐躲,于是試著換so名字,結(jié)果告訴我沒有找到so庫(kù)侍筛! 那么也就是說so庫(kù)被加載了萤皂,但是運(yùn)行不了里面的方法。這個(gè)問題在一年前其實(shí)也遇到過匣椰,后來規(guī)避過去了裆熙,沒想到人算不如天算啊。
方法二
此時(shí)'恰巧'CTO看見了我的問題窝爪,告訴我AndroidStudio是會(huì)將SO庫(kù)進(jìn)行壓縮的弛车。于是又換了另一個(gè)方法,大概思路是將so先打包成一個(gè)jar蒲每,然后加載jar。示例代碼如下:
同樣是在android{}下
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$projectDir/gen")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into "lib"
}
sourceSets.main {
jni.srcDirs = ['asjni']
jniLibs.srcDir 'jnilibs'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
可以按照自己心情改的:
destinationDir 是生成目錄喻括,baseName 是文件的名字邀杏,extension 是文件后綴,nativeLibsToJar是方法名。
最后在去依賴jar即可望蜡,我是這樣依賴的:
compile fileTree(dir: "$projectDir/gen", include: 'native-libs.jar')
也可生成jar后手動(dòng)放到libs下唤崭,按照個(gè)人喜好即可。
有一點(diǎn)要注意的是脖律,一定要記得清除上次build的文件谢肾,也就是clean一下,不然如果按照常規(guī)方式加so庫(kù)然后在換成第二種方式再加載可能加載的還是第一次build中的文件小泉。這個(gè)問題耽誤了我很長(zhǎng)時(shí)間芦疏,導(dǎo)致我認(rèn)為第二種方式失效了。
注意!!!
并不是所有版本的AS都會(huì)自動(dòng)壓縮微姊,在公司電腦中第一種方式無法運(yùn)行酸茴,但是在家里的電腦 第一種方式完美運(yùn)行,并沒有被壓縮兢交。
懷疑1:是AS的設(shè)置里有個(gè)開關(guān)薪捍,設(shè)置是否壓縮之類的
懷疑2:AS版本導(dǎo)致
總之,多掌握個(gè)技巧也是好的配喳。這種錯(cuò)不要再犯第二次了~