【发布时间】:2016-06-07 00:54:23
【问题描述】:
我正在尝试向我在 Android Studio 中的项目添加一个本地预构建的共享库。我正在使用 gradle-experimental:0.6.0-alpha5。但是,每当我尝试将预构建的共享库添加到我的应用程序模型时,都会收到以下错误:
错误:原因: org.gradle.api.internal.PolymorphicDomainObjectContainerConfigureDelegate
将库添加到应用程序模型中,Google Gradle Experimental Guide 是如何描述的:
repositories {
prebuilt(PrebuiltLibraries) {
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so")
}
}
}
android.sources {
main {
jniLibs {
dependencies {
library "shared_lib"
}
}
}
}
关键的一行是library "shared_lib"。如果我取消注释此行,则不会出现错误。
由于这不起作用,我也尝试使用来自ph0b.com 的指南。他们使用不同的语法来添加本机共享库(我只是省略了标题,因为我没有包含所有标题的单个目录):
repositories {
libs(PrebuiltLibraries) {
shared_lib {
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so")
}
}
}
}
android.sources {
main {
jni {
dependencies {
library "shared_lib" linkage "shared"
}
}
}
}
尽管如此,这也不起作用。 Android Studio 不会将我的 shared_lib 复制到 apk 文件中。因此,我总是收到以下错误:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [...] 找不到“shared_lib.so”
谁能告诉我如何将原生预构建库包含到我的项目中?我使用 buildToolsVersion = '22.0.1' 和 compileSdkVersion = 22 作为构建参数。
【问题讨论】:
-
您可以尝试使用 .so 的硬编码路径而不是
${targetPlatform.getName()}吗? -
是的,我已经试过了。 Gradle 绝对可以解析路径,因为如果我将路径更改为不存在的文件,则会出现错误。如果我的问题有解决方案,我仍然会很高兴。但是,我不再使用预建库暂时解决了我的问题。我将所有必要的带有
cppFlags.add("-I${file("./../../../projects/test/include")}".toString())的头文件和带有srcDirs += "./../../../projects/test/src/"的cpp 文件添加到jni。但是能够使用预构建的库仍然会更好。 -
你能用
--stacktrace运行并抓住更多的错误吗? -
你能解决这个问题吗? (除了临时解决方案)我在尝试链接我的 .so 时遇到同样的问题
-
您看过 Google 的 NDK 示例吗? github.com/googlesamples/android-ndk
标签: java android gradle android-ndk java-native-interface