使用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工具链已经过时。请随时发布更新的答案,以帮助那些使用最新工具的人。