我会第一个承认我对Gradle和新的Android构建系统并不是非常专业,但不幸的是,由于问题21479(https://code.google),我不得不转移到它(来自ant).com/p/android/issues/detail?id = 21479)和评论"这将不会修复.我们正专注于完成将取代Ant的基于Gradle的构建系统." 不幸的是,在我添加了Millenium Media广告库之后,我无法重新构建这些东西.这是Android OpenCV库,Chilkat的加密库和支持v4库的补充,但MMedia库是破坏它的一个.
所以,我认为,这是一个很好的理由,可以迁移到新的基于Gradle的构建系统.不幸的是,尽管留下了破坏的蚂蚁构建系统,新系统似乎还没有完成; 特别是ndk的支持.
我正在使用的应用程序使用OpenCV进行一些图像处理,并且一些操作运行得太慢,除非它们被编译为本机(很多内存移动并比较在JNI边界上太慢).因此,我不是试图在VM和本机代码之间来回传递数据,而是将所有这些内容留在本机端,只需从VM调用一次即可获得结果.
第一个问题是编译ndk的东西.我无法使ndk闭包中的设置工作,所以我不得不求助于使用ndk-build命令并将其作为任务执行:
task ndkBuild(type: Exec) {
String MainDirectory = System.getProperty("user.dir") + '/app/src/main'
println "Main app directory for NDK build " + MainDirectory
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine 'gradle-ndk-build.cmd', MainDirectory, '-j'
}
else {
commandLine 'gradle-ndk-build', MainDirectory, '-j'
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
Run Code Online (Sandbox Code Playgroud)
这很完美; 它编译ndk代码并生成.so库而不会出错.不幸的是,它不会将最终的.so文件放在最终的包中.它把所有其他本地库都放在了,但不是这个 - 不知道为什么.
我发现了许多针对此问题的修复程序,例如:
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}
Run Code Online (Sandbox Code Playgroud)
但是添加它只会产生一个apk文件,根本没有本机库.我见过其他人有同样的问题(例如https://groups.google.com/forum/#!msg/adt-dev/QbDHM41QT2E/J4jHCC_RuIEJ)但我已经尝试了所有提议的解决方案,但没有一个为我工作.
因为我不经常更改本机代码,所以我刚刚做了一个hack,将生成的本机库(libndklib.so)从app/src/main/libs复制到/ app/src/main/jni之后编制; …