【问题标题】:Android NDK build cmake include .so library included in .aar libraryAndroid NDK 构建 cmake 包含 .aar 库中包含的 .so 库
【发布时间】:2018-08-20 12:31:48
【问题描述】:

我有一个 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 内部进行。

【问题讨论】:

  • 确实非常好! 我相信 gradle 如果 .aar 确实会提取 .so 文件 是一个依赖项。
  • 我是这么认为的。但它不会在 cmake 构建之前提取。我不知道为什么。我搜索了一下,没有找到比这个方法更简单的答案。
  • ...但在您的解决方案中,aar 并未声明为项目的依赖项,是吗?
  • 它还必须将库声明为依赖项。由于库的 Java 部分。我不太了解依赖 decleration 是否也会影响 JNI 部分。

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


【解决方案1】:

经过 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

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2014-03-30
    • 1970-01-01
    • 2018-10-18
    • 2021-05-29
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多