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

9
我有一个名为 android_library.aar 的文件,其中包含 library.so 和其他资源和Java文件。
我将 android_library.aar 导入到我的项目中。我的项目使用具有NDK的C ++代码。我的问题是,我无法使用CMake编译依赖于 library.so 的C ++代码。在CMake编译之前,我该如何从 aar 中提取 library.so ?我想直接将 library.so 包含到我的C ++代码中,而不需要Java。我知道如何在项目中包含 .so ,但我不知道如何从aar内部执行此操作。

1
非常好!我相信如果**.aar是依赖项,gradle确实会提取.so**文件。 - Alex Cohn
我也是这么想的。但在cmake构建之前它并没有被提取出来。我不知道为什么。我搜索了一下,没有找到比这种方法更简单的答案。 - Almas Dusal
但是在你的解决方案中,aar 没有被声明为你的项目依赖,是吗? - Alex Cohn
1
还必须将库声明为依赖项。因为Java是库的一部分。我不知道依赖项声明是否也会影响JNI部分。 - Almas Dusal
1个回答

2

经过一周的研究,我自己找到了解决方案。我从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接