android studio 加载so文件的各种问题

在0.4.0版本时我总结了一篇文章,android studio V0.4.0调整

之前的理解有点不到位,把最近的理解记录下,大家帮我纠正,谢谢。


先上脚本代码:

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目录下;

2.compileTask.dependsOn copyNativeLibs 把1中的task依赖于编译任务,这样每次在编译前,就是把1中的copyNativeLibs方法执行;

3.clean.dependsOn ‘cleanCopyNativeLibs‘这行脚本容易理解,把clean build/native-libs 依赖于gradlew clean;

4.tasks.withType,在这块脚本中需要注意理解两点:

a.之前我们通过1把我们需要的so文件都拷贝到主项目(app)的build/native-libs中;

b.jniFolders,我的理解是打包时默认的jni文件目录。把默认的jniFolders修改成我们自己指定的目录,即build/native-libs,从而so文件便能够被打入apk中。


有关多module的so文件加载:

首先,说说你的理解,多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同样方法处理;


以上解决方案是我本人多次尝试得出的结论,如有理解偏差,欢迎留言或者邮件我(邮箱:[email protected]




android studio 加载so文件的各种问题,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。