2

我正在使用 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 文件都会正确复制到所有文件夹中。

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

4

1 回答 1

0

通过执行以下操作解决了此问题:

  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")
        }
    }
}
于 2016-05-31T09:17:55.547 回答