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”目录内。

相关文章
相关标签/搜索