【问题标题】:How to copy or use native libs with Android Studio Gradle build?如何通过 Android Studio Gradle 构建复制或使用本机库?
【发布时间】:2013-07-08 08:34:40
【问题描述】:

我有一个本地库

/libs/armeabi 文件夹名为 libparser.so 以及相关的 jar 文件。

我更改了 gradle 构建文件以包含 jar 文件,这似乎很容易(MYNEWJAR):

dependencies {
    compile files('libs/android-support-v4.jar', 'libs/MYNEWJAR.jar')
}

但是当我运行该应用程序时,我认为它找不到本机库:

E/AndroidRuntime(22569): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load parser from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.hybris.mobile.history-1.apk,libraryPath=/data/app-lib/com.hybris.mobile.history-1]: findLibrary returned null
E/AndroidRuntime(22569):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime(22569):    at java.lang.System.loadLibrary(System.java:535)
E/AndroidRuntime(22569):    at com.senstation.android.pincast.Pincast.<clinit>(Pincast.java:1299)
E/AndroidRuntime(22569):    ... 17 more

你能帮我把构建文件直接包含进去吗?这似乎在 Eclipse 上自动发生,但我真的很想使用 android studio。

谢谢! 斯文

【问题讨论】:

  • 您是否尝试过将项目重新导入 Android Studio?根据您的堆栈跟踪,com.hybris.mobile.history-1 存在问题 - 不在 android-support-v4.jar 中。

标签: android gradle android-studio


【解决方案1】:

我发现用户Assaf Gamlielthis 回答非常有用。

只是做了一些改变,让它更干净。

您无需将 .zip 文件重命名为 .jar,只需将其添加到 build.gradle 脚本的普通 编译文件 依赖项即可。因此,您将创建一个 foo.zip 文件,其结构类似于:

foo.zip ->
|--/lib
|--|--/armeabi
|--|--|--*.so
|--|--/x86
|--|--|--*.so

把它放在你的 libs 文件夹中,然后使用 compile files('libs/foo.zip') 将它添加到 gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+' //gradle plugin update for Andoid Studio 0.2.+
    }
}
apply plugin: 'android'
dependencies {
    compile files('libs/android-support-v4.jar')
    compile files('libs/foo.zip') //zip file should be in Module's /libs folder (not the Project's /lib)
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

当 gradle 进行构建时,它只是解压缩您添加的文件并保留其结构。

【讨论】:

  • 更新为添加完整的 build.gradle 脚本,依赖项应该作为编译文件依赖项添加,其中 android-support-v4.jar 被添加,而不是作为类路径依赖项(用于 maven)
  • 我可以确认这种解决方法确实有效——奇怪的是它不适用于 tar.bz2 档案——似乎它们被默默地忽略了!让我们希望 Android Gradle 插件能尽快处理这个问题......
【解决方案2】:

使用外部 jar 库

  1. 将 jar 放入 libs 文件夹/从文件资源管理器将文件拖到 libs 上
  2. 右键单击它并选择Add as library
  3. 确保 compile files('libs/your_jar.jar') 在您的 build.gradle 文件中

    为此,请修改左侧 project 窗格中 [projectname]Project -> [projectname] 下的 build.gradle。

    对我来说,有必要改变

    dependencies {
        compile 'com.android.support:support-v4:13.0.+'
    }
    

    dependencies {
        compile 'com.android.support:support-v4:13.0.+'
        compile files('libs/universal-image-loader-1.8.5.jar')
    }
    

  4. 点击Build菜单下的Rebuild Project

我今天这样做是为了让 Universal Image Loader 库与我的项目集成。

【讨论】:

    【解决方案3】:

    在 'app/src/main/' 中创建一个名为 'jniLibs' 的目录并放入所有的 .so 中

    app/src/main/jniLibs/
    |---- armeabi-v7a/your.so
    |---- armeabi/your.so
    |---- x86/your.so
    

    【讨论】:

    • 如果您使用的是 Gradle 插件的 0.7.2+,这是正确的答案。这里有更多细节:stackoverflow.com/a/20926595/897397。记得调用 System.loadLibrary("LIBNAME");您的库名称是 libLIBNAME.so
    【解决方案4】:

    嗯...我希望有人能提供一个明确的例子, 如何使 Android-Studio 可以访问第 3 方 JAR 文件,通过 显示生成的“build.gradle”文件的确切语法 在他们添加了他们的“foobar.jar”之后,依赖子句看起来像 进入。

    你知道的,比如:

    =========

    dependencies {
        compile 'com.android.support:support-v4:13.0.+'
        compile 'org.somedevs.foobar:Foobar.jar'
    }
    

    =========

    [否则,我连滚雪球的机会都没有 猜测到目前为止发布的答案的真正含义。我的 INTITAL 子句包含单个“编译”行......所以我的 猜猜那个人会不会再添加一条这样的行!?!?]

    编辑:是的,非常感谢,叛逆!我现在也有它的工作。 [在 Studio 中,我没有将“拖放”到“库”上,而是有更多 只需右键单击 Studio 中的“库”并选择即可获得可靠的结果 “添加为库...”,在将 JAR 复制到该位置后,使用 cmd-line。]

    dependencies 子句的正确格式如下所示:

     dependencies {
            compile 'com.android.support:support-v4:13.0.+'
            compile files ('libs/Foobar.jar')
        }
    

    【讨论】:

    • 在 'app/src/main/' 中创建一个名为 'jniLibs' 的目录并放入所有的 .so 中
    【解决方案5】:

    出于安全原因,无法使用 gradle android 插件在应用项目中引用本地 jar/aar 文件。


    对于支持库,使用 Android SDK 管理器,您必须安装名为 Android Support Repository 的额外文件,它将在 maven 存储库中公开支持库。然后您可以通过以下方式在您的项目中添加支持库:

    dependencies {
        compile 'com.android.support:support-v4:13.0.0'
    }
    

    对于外部库,您有两种可能性:

    • 构建一个 aar 文件并将其部署到本地 maven 存储库,然后像使用 android 支持库一样在项目中引用它。
    • 将库源放在您的应用程序项目旁边,并在根目录下创建一个settings.gradle 来定义模块。 (有关详细信息,请参阅 docs)。

    就我而言,我更喜欢构建 aar 文件,因为它更加模块化。

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2015-09-17
      • 1970-01-01
      • 2013-10-15
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2013-07-04
      相关资源
      最近更新 更多