使用cmake for Android时将共享对象复制到jniLibs 我最近开始把Android的构建从蚂蚁转移到Gradle,然后我想用cGoad来做C++代码。构建当前运行正常,但在创建aar文件之前,没有将共享对象复制到jniLibs文件夹中(这是一个库项目,当前构建在Windows 10上)
我已经查看了使用使用cmake for Android时将共享对象复制到jniLibs 我最近开始把Android的构建从蚂蚁转移到Gradle,然后我想用cGoad来做C++代码。构建当前运行正常,但在创建aar文件之前,没有将共享对象复制到jniLibs文件夹中(这是一个库项目,当前构建在Windows 10上),android,c++,gradle,cmake,Android,C++,Gradle,Cmake,我已经查看了使用/gradlew assembleDebug构建时正在运行的任务。它们是: :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE :app:checkDebugManifest :app:preDebugAndroidTestBuild UP-TO-DATE :app:preDebugUnitTestBuild UP-TO-DATE :app:preReleaseBuild UP-TO-DATE :app:preReleas
/gradlew assembleDebug
构建时正在运行的任务。它们是:
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:preDebugUnitTestBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:preReleaseUnitTestBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72221Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42221Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileLint UP-TO-DATE
:app:copyDebugLint UP-TO-DATE
:app:copyLibs
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:incrementalDebugJavaCompilationSafeguard UP-TO-DATE
:app:compileDebugJavaWithJavac UP-TO-DATE
:app:extractDebugAnnotations UP-TO-DATE
:app:mergeDebugShaders UP-TO-DATE
:app:compileDebugShaders UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:mergeDebugProguardFiles UP-TO-DATE
:app:packageDebugRenderscript UP-TO-DATE
:app:packageDebugResources UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:app:transformClassesAndResourcesWithSyncLibJarsForDebug UP-TO-DATE
:app:generateJsonModelDebug UP-TO-DATE
:app:externalNativeBuildDebug
building E:\path\to\app\Android\app\.externalNativeBuild\cmake\debug\libs\x86\libApp.so
building
:app:mergeDebugJniLibFolders
:app:transformNative_libsWithMergeJniLibsForDebug
:app:transformNative_libsWithSyncJniLibsForDebug
:app:bundleDebug
:app:compileDebugSources
:app:assembleDebug
这很好,但是文件夹app/src/main/jniLibs
是空的,因此没有共享对象被复制到aar文件中。因此,接下来的问题是如何添加一个gradle构建步骤来实际复制这些文件。事实证明,这很难做到
方法1:
尝试创建要在:app:bundleDebug
任务之前运行的复制任务。我已经做了一些尝试:
第一种可能性:
task copyLibs(type: Copy, dependsOn: 'bundleDebug') {
from ('.externalNativeBuild/cmake/debug/libs') {
include '**/libApp.so'
}
into 'src/main/jniLibs'
}
task copyLibs(type: Copy) {
from ('.externalNativeBuild/cmake/debug/libs') {
include '**/libApp.so'
}
into 'src/main/jniLibs'
}
tasks.whenTaskAdded { task ->
if (task.name == 'bundleDebug') {
task.dependsOn copyLibs
}
}
第二种可能性:
task copyLibs(type: Copy, dependsOn: 'bundleDebug') {
from ('.externalNativeBuild/cmake/debug/libs') {
include '**/libApp.so'
}
into 'src/main/jniLibs'
}
task copyLibs(type: Copy) {
from ('.externalNativeBuild/cmake/debug/libs') {
include '**/libApp.so'
}
into 'src/main/jniLibs'
}
tasks.whenTaskAdded { task ->
if (task.name == 'bundleDebug') {
task.dependsOn copyLibs
}
}
请注意,路径是正确的,因为我可以通过使用
taskcopylibs强制执行复制,我最终找到了执行方法。要包含来自某个地方的构建共享对象,我们需要在build.gradle的android
部分中使用sourceset.main.jniLibs.srcDirs
。下面的示例直接从Android cmake输出目录中获取共享对象(用于调试)
例如:
android {
...
defaultConfig {
...
}
buildTypes {
release {
}
debug {
}
}
sourceSets {
main {
// Bundle so files with the final apk.
// NOTE: Currently bundles all shared objects in that directory.
// It was not straightforward to exclude in Android sourceSets at the time of writing,
// see https://code.google.com/p/android/issues/detail?id=64957
jniLibs.srcDirs = ['.externalNativeBuild/cmake/debug/libs']
}
}
externalNativeBuild {
cmake {
path '../../../CMakeLists.txt'
}
}
}
我认为这不是个好主意。“.externalNativeBuild/cmake/debug/libs”文件夹是一个生成文件夹,用于查找其他预生成共享库文件。我认为最好的办法是将依赖项库文件复制到版本控制器下的jniLib文件夹中。如果使用android gradle插件更新版4.0.0,该插件将自动完成复制工作(请参阅)。这个问题可能已经过时,因为最新的android工具链已经过时。请随时发布更新的答案,以帮助那些使用最新工具的人。