【问题标题】:Native prebuilt shared library in Android Studio with experimental Gradle plugin带有实验性 Gradle 插件的 Android Studio 中的本机预构建共享库
【发布时间】: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


【解决方案1】:

这个对我有用(0.6.0-beta6)。

repositories {
    prebuilt(PrebuiltLibraries) {
        YourLib {
            binaries.withType(SharedLibraryBinary) {
                sharedLibraryFile = file("src/main/libs/armeabi-v7a/libYourLib.so")
            }
        }
    }
}

android.sources {
    main {
        jniLibs {
            dependencies {
                library "YourLib"
            }
        }
    }
}

看起来他们只是忘了提及“binaries.withType”周围的“YourLib {}”部分。

【讨论】:

  • 谢谢!这在 gradle-experimental:0.6.0 上对我有用
  • 我会将其标记为一般问题的解决方案。 @Zhur 的语法是正确的。但是,我认为 UnsatisfiedLinkError 是一个更复杂的错误,主要与 Gradle 文件无关。
  • @budderick 它有:由于 Gradle 文件不正确,共享库没有进入 APK。所以在运行时链接器找不到那个库并抛出异常。
  • 是的,在这种情况下,您的解决方案是正确的。我只是想说,问题可能还更深。我的一个项目使用您的解决方案,另一个没有。
  • 我认为这不适用于最新的 gradle 实验设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2013-06-11
相关资源
最近更新 更多