【问题标题】:Gradle using PreBuilt Static LibraryGradle 使用 PreBuilt 静态库
【发布时间】:2015-03-06 23:30:18
【问题描述】:

我正在从 Eclipse 迁移到 Android Studio,并且我正在尝试使用 Gradle 来包含 PreBuilt 静态库。 我正在关注 ndk 示例项目提供的两个库示例,并在 Android Studio 中实现它。

我有什么:

预建的静态库:

[ndk 路径]\samples\two-libs\obj\local\armeabi-v7a\libtwolib-first.a

库的头文件:

[ndk 路径]\samples\two-libs\jni\first.h

包含单个方法:

extern int first(int  x, int  y);

现在如何在 android studio 中将其用作预构建的静态库?

我尝试了什么:

添加文件: 通过创建 jniLibs 将库添加到我的 android studio 项目中(我读到这是用于 preBuild 动态库,不确定 preDuilt 静态库是否也应该使用此路径):

[android-studio-project-path]\app\src\main\jniLibs\armeabi-v7a\libtwolib-first.a

并将头文件添加到:

[android-studio-project-path]\app\src\main\jni\first.h

代码更改:

在java中: 称为本机方法 Foo。

在 JNI 头文件中: 声明了 Foo 方法。

在实现JNI头的c文件中: 添加了#include“first.h” 并调用了第一个方法。

但我在编译过程中遇到错误:

“错误:未定义对‘first’的引用”

我猜这是因为在编译期间它没有找到 first.h 的实现文件并且不能动态加载它。 如果我添加 first.c 文件(实现文件而不是将其作为库加载它可以工作)

我是 c 代码和 JNI 的新手,所以任何帮助都会很好!

【问题讨论】:

    标签: android build gradle


    【解决方案1】:

    我一直在努力解决同样的问题,并尝试了各种技巧,浪费了很多时间,直到我遇到了这个问题:https://groups.google.com/d/msg/adt-dev/FoyeXl2vl3s/jLvH5lztDwAJ 并找到了解决方案。 在您的build.gradle 文件中,将预构建的库作为ldLibs 的一部分放在android.ndk 部分中,例如

    android.ndk {
        moduleName = "myJniModule"
        stl = "gnustl_shared" // Or whichever you like
        // Put your cppFlags or CFlags here too
        ldLibs += ['twolib-first'] // The name of your prebuilt lib without file suffix and 'lib' prefix
    }
    

    然后在productFlavors中添加ldFlags中预建库的路径:

    android.productFlavors {
        create("arm") {
            ndk.with {
                abiFilters += "armeabi-v7a"
                ndk.ldFlags += "-L${file("app/src/main/jniLibs/armeabi-v7a/")}".toString()
            }
        }
    }
    

    这至少对我有用。我正在使用实验性 Gradle 插件 v0.2.0。

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      相关资源
      最近更新 更多