Android NDK构建cmake包括.aar库中包含的.so库

时间:2018-08-20 12:31:48

标签: android c++ android-ndk java-native-interface aar

我有一个 android_library.aar 文件,其中包含 library.so 以及其他一些资源和Java文件。

我将 android_library.aar 导入了我的项目。我的项目在NDK中使用c ++代码。我的问题是我无法使用CMake编译依赖于 library.so 的C ++代码。在CMake编译之前,如何从 aar 中提取 library.so ?我想直接在Java中将 library.so 包含到我的C ++代码中。我知道如何在项目中包含 .so ,但我不知道如何从aar内部进行。

更新(解决方案):

我在这里写一个答案,因为我还没有对Stackoverflow的回答权限。

经过1周的研究,我自己找到了解决方案。我从Google GVR代码中找到了一些代码。但这不适用于我的情况。我将 build.dependsOn 更改为 preBuild.dependsOn ,然后它起作用了。将来可能对某些人有帮助。

以下是示例代码:

在模块的build.gradle文件中:

sourceSets {
    main {
        jniLibs.srcDirs = ["jniLibs"]
    }
}

task extractSo(type: Copy) {
    println 'Extracting *.so file(s)....'

    from zipTree("${project.rootDir}/ModuleName/ModuleName.aar")
    into "${project.rootDir}/${project.name}/src/main/jniLibs/"
    include "jni/**/*.so"

    eachFile {
        def segments = it.getRelativePath().getSegments() as List
        println segments
        it.setPath(segments.tail().join("/"))
        return it
    }
    includeEmptyDirs = false
}

preBuild.dependsOn extractSo

1 个答案:

答案 0 :(得分:0)

经过1周的研究,我自己找到了解决方案。我从Google GVR代码中找到了一些代码。但这不适用于我的情况。我将 build.dependsOn 更改为 preBuild.dependsOn ,然后它起作用了。将来可能对某些人有帮助。

以下是示例代码:

在模块的build.gradle文件中:

sourceSets {
    main {
        jniLibs.srcDirs = ["jniLibs"]
    }
}

task extractSo(type: Copy) {
    println 'Extracting *.so file(s)....'

    from zipTree("${project.rootDir}/ModuleName/ModuleName.aar")
    into "${project.rootDir}/${project.name}/src/main/jniLibs/"
    include "jni/**/*.so"

    eachFile {
        def segments = it.getRelativePath().getSegments() as List
        println segments
        it.setPath(segments.tail().join("/"))
        return it
    }
    includeEmptyDirs = false
}

preBuild.dependsOn extractSo