【问题标题】:Native libraries (*.so) files missing in the aar file(if dependent library is a shared library)aar 文件中缺少本机库 (*.so) 文件(如果依赖库是共享库)
【发布时间】:2016-05-20 12:02:27
【问题描述】:

我正在使用 Android Studio 1.5.1 Gradle 版本 2.8。 Gradle 实验插件 v0.4.0 我也有一个包含本机 C 代码和 java 代码的库。我正在生成一个库 CoreLib-fat-release.aar,其中包含适用于所有架构(libcore.so)的本机库 - arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86-64。 我有第二个库,具体取决于我的核心库。我将核心库作为共享库。

在第二个库的 gradle 文件中:

jni {
            dependencies {
                project ":CoreLib" buildType "release" productFlavor "fat" linkage "shared"
            }
    }

它能够正确构建,但是当我打开并看到第二个库 aar 文件时,我在所有架构文件夹中都没有看到 libcore.so。

例如: SecondLibrary-fat-release.aar => SecondLibrary-fat-release-zip 在 SecondLibrary-fat-release/jni 文件夹中,只有 x86 和 x86_64 文件夹包含 libcore.so 文件。其他文件夹(arm64-v8a、armeabi、armeabi-v7a、mips、mips64)不包含 libcore.so 文件。

由于这个原因,如果我在 64 位设备中使用我的第二个库,它会抱怨 UnSatisfiedLink 错误,说找到 32 位库而不是 64 位。

这是我的第二个库的 build.gradle:

apply plugin: 'com.android.model.library'
model {
android {
    compileSdkVersion = 21
    buildToolsVersion = "23.0.2"
    defaultConfig.with {
        minSdkVersion.apiLevel = 21
        targetSdkVersion.apiLevel = 21
        testInstrumentationRunner = "android.test.InstrumentationTestRunner"
    }
    lintOptions.with {
        abortOnError = false
    }
}
android.ndk {
    moduleName = "secondlibrary
    cppFlags.addAll("-I${file(folder_path)}".toString(),
            "-I${file(sourcesDir +folder1)}".toString(),
            "-I${file(sourcesDir +folder2)}".toString(),
    )
    cppFlags.add("-frtti")
    cppFlags.add("-fexceptions")
    CFlags.addAll("-I${file(folder_path)}".toString(),
            "-I${file(sourcesDir +folder1)}".toString(),
            "-I${file(sourcesDir +folder2)}".toString(),
    )
    CFlags.add("-O3")
    CFlags.add("-funroll-loops")
    CFlags.add("-Wall")
    ldLibs.addAll(["android", "log", "stdc++", "c", "m", "z", "EGL", "GLESv2"])
    stl = "gnustl_shared"
}
// jni is the default dir; config this if yours is in different directory
android.sources {
    androidTest {
        java {
            source {
                srcDirs '../test_sources_path/src'
            }
        }
    }
    main {
        manifest {
            source {
                srcDirs '.'
            }
        }
        java {
            source {
                srcDir "src"
            }
        }
        jni {
            dependencies {
                project ":CoreLib" buildType "release" productFlavor "fat" linkage "shared"
            }
            source {
                srcDirs = ["jni",
                           path1,
                           path2,
                           "libcore.so"]
            }
        }
        jniLibs {
            dependencies {
                library file(path_to_binaries + "libcore.so") abi "armeabi"
                library file(path_to_binaries + "libcore.so") abi "x86"
                library file(path_to_binaries + "libcore.so") abi "armeabi-v7a"
                library file(path_to_binaries + "libcore.so") abi "mips"
                library file(path_to_binaries + "libcore.so") abi "x86_64"
                library file(path_to_binaries + "libcore.so") abi "arm64-v8a"
                library file(path_to_binaries + "libcore.so") abi "mips64"
            }
        }
    }
}
android.productFlavors {
    create("fat")
}
repositories {
    libs(PrebuiltLibraries) {
        CoreLib {
            binaries.withType(SharedLibraryBinary) {
                sharedLibraryFile = file(path_to_binaries + "${targetPlatform.getName()}/libcore.so")
            }
        }
    }
}
 }
 dependencies {
     compile project(':CoreLib-fat-release')
 }

注意:如果我将 CoreLib 链接设为“静态”而不是“共享”,则所有 libcore.so 文件都会正确复制到所有文件夹中。

请让我知道这是编程问题还是实验性插件中的错误。如果您知道任何替代方法,请建议我?谢谢。

【问题讨论】:

  • 计划使用 0.6.0 实验性插件,因为他们清楚地提到了原生库依赖解析的改进。将根据我的发现更新这篇文章。 tools.android.com/tech-docs/new-build-system/… 0.6.0-alpha3 用于指定预建库依赖的 DSL 已更改。更新到 Gradle 2.8。修复了原生库依赖解析的各种问题。

标签: android gradle build.gradle gradle-experimental


【解决方案1】:

通过以下操作解决了这个问题:

  1. 我已将实验插件版本从 0.4.0 更改为 0.7.0(gradle 版本 2.10)。
  2. build.gradle 中所需的更改:

    • 我们需要在模型元素之外定义变量。
    • 我们可以删除

      jniLibs {
              dependencies {
                   library file(path_to_binaries + "libcore.so") abi "armeabi"
                   library file(path_to_binaries + "libcore.so") abi "x86"
                   library file(path_to_binaries + "libcore.so") abi "armeabi-v7a"
                   library file(path_to_binaries + "libcore.so") abi "mips"
                   library file(path_to_binaries + "libcore.so") abi "x86_64"
                   library file(path_to_binaries + "libcore.so") abi "arm64-v8a"
                   library file(path_to_binaries + "libcore.so") abi "mips64"
              }
      }
      

因为这块代码就足够了:

repositories {
libs(PrebuiltLibraries) {
    CoreLib {
        binaries.withType(SharedLibraryBinary) {
            sharedLibraryFile = file(path_to_binaries + "${targetPlatform.getName()}/libcore.so")
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 2016-10-04
    • 2011-10-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多