一、eclipse项目迁移到android studio后so文件配置问题
1、
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同样方法处理;
二、android studio新建项目so文件配置问题:
1.在“src/main”目录中新建名为“jniLibs”的目录;
2、在“jniLibs”目录中新建名为“armeabi”的目录;
3. 将so文件复制、粘贴到“armeabi”目录内。