【发布时间】: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