android studio加載so包問題


1、eclipse項目遷移到android studio後so文件配置問題
android

一、app

android {
 
     ......
     task copyNativeLibs(type: Copy) {
         from fileTree(dir: 'libs' , include: '*/*.so' )  into  'build/native-libs'
     }
     tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
 
     clean.dependsOn 'cleanCopyNativeLibs'
 
     tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
         pkgTask.jniFolders = new HashSet()
         pkgTask.jniFolders.add( new File(projectDir, 'build/native-libs' ))
         println pkgTask.jniFolders
     }
}

1.copyNativeLibs,他的做用就是把dir中的so文件拷貝的主項目(例如app)的build/native-libs目錄下;eclipse

2.compileTask.dependsOn copyNativeLibs 把1中的task依賴於編譯任務,這樣每次在編譯前,就是把1中的copyNativeLibs方法執行;
gradle

3.clean.dependsOn 'cleanCopyNativeLibs'這行腳本容易理解,把clean build/native-libs 依賴於gradlew clean;
ui

4.tasks.withType,在這塊腳本中須要注意理解兩點:code

a.以前咱們經過1把咱們須要的so文件都拷貝到主項目(app)的build/native-libs中;ip

b.jniFolders,個人理解是打包時默認的jni文件目錄。把默認的jniFolders修改爲咱們本身指定的目錄,即build/native-libs,從而so文件便可以被打入apk中。it



有關多module的so文件加載:io

    多module項目,某個子moudle可能須要jni支持,一樣也面臨so文件打包問題。編譯

1.直接把全部子module的so文件都拷貝到主項目的libs中;

2.子module中的build.gradle一樣包含上述腳本,把build/native-libs修改爲主項目的絕對路徑;

3.修改copyNativeLibs,這裏既然作so文件的拷貝操做,那我直接把子module的dir加入,下面是對應的腳本;

android {
     ......
     task copyNativeLibs(type: Copy) {
         def libPath = project( ':lib' ).projectDir.absolutePath + '/libs'
         println libPath
         from fileTree(dir: 'libs' , include: '*/*.so' )  into  'build/native-libs'
         from fileTree(dir: libPath, include: '*/*.so' )  into  'build/native-libs'
     }
     tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
 
     clean.dependsOn 'cleanCopyNativeLibs'
 
     tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
         pkgTask.jniFolders = new HashSet()
         pkgTask.jniFolders.add( new File(projectDir, 'build/native-libs' ))
         println pkgTask.jniFolders
     }
}


說明:

a.project(':lib')中的lib是須要jni支持的子module,這裏書寫子module的具體名稱,能夠參照setttings.gradle;

b.libPath獲取到子moudle下存放so文件的libs絕對目錄;

c.多個子module一樣方法處理;


2、android studio新建項目so文件配置問題:

    1.在「src/main」目錄中新建名爲「jniLibs」的目錄;

    二、在「jniLibs」目錄中新建名爲「armeabi」的目錄;

    3.    將so文件複製、粘貼到「armeabi」目錄內。

相關文章
相關標籤/搜索