Android Studio、Gradle、OpenCV和NDK

11

我正在尝试在Android Studio上测试OpenCV Android,但困惑于如何包含NDK。

我的目标是运行OpenCV附带的样例。六个样例中,我已经成功地运行了其中四个。唯独face-detection和native-activity出现了异常。

我怀疑问题出在我没有正确设置我的NDK。

通过谷歌搜索,我找到了很多讨论,但并不真正理解它们。这是我第一次尝试同时使用NDK和OpenCV,我的Gradle理解有限。

我在我的.bash_profile文件中设置了一个环境变量:

export ANDROID_NDK=pathTo/android-ndk-r9

我不明白如何将其传递给studio。

我看到jniFolder的参考,但不明白这些是什么,我现在应该关注吗? Stackoverflow.com/questions/17767557

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(projectDir, 'native-libs'))

}

我应该把这个粘贴到我的build.gradle文件的末尾,该怎么做?

总之,我的问题是:

  1. 如何让Android Studio读取NDK变量?
  2. jniFolders到底是什么?
  3. 只需将其粘贴到我的build.gradle文件末尾是否足够?

Gradle和NDK的Google Group讨论


对于任何遇到此问题的人,除了Xavier的答案外,以下是我的解决方法。 首先,我阅读了NDK所附带的OVERVIEW.html文件,在文档目录中。 然后,我将.mk和.cpp文件编译成.so文件。 我在示例jni目录中完成了此操作。 这将在libs文件夹中创建.so文件,我将其复制到Xavier给出的目标位置。


我成功地完成了这个任务,而且没有编译任何东西。请查看:https://dev59.com/914c5IYBdhLWcg3w6Ns7#35135495,也许会有所帮助。 - ssimm
1个回答

32

如果您有使用ndk构建的库,并希望将它们放入使用gradle插件版本0.7.+的Android项目中,您只需将它们放入即可。

src/main/jniLibs/<abi>/libfoo.so
例如:

for example:

src/main/jniLibs/armeabi-v7a/libfoo.so
src/main/jniLibs/x86/libfoo.so

它们将自动打包。

如果您想将它们保留在native-libs文件夹中,可以将以下内容放入您的gradle文件中:

android {
    sourceSets.main {
        jniLibs.srcDirs = ['native-libs']
    }
}

这只是告诉Gradle主源集的jniLibs文件夹在项目根目录下的位置。

你展示的片段正在做不同的事情。它告诉package任务还包括一些本地库。这是一个早期版本中使用任务的未记录API的 hack,现在不再支持。


1
在库项目中不起作用,您必须将 .so 文件复制到您的应用程序项目中,然后它就可以完美地工作了。 - Frank
这个功能已经发布了吗?可以从库项目中导出二进制“*.so”文件吗? - Hossain Khan
是的,AAR 应该现在打包他们的 so 文件。 - Xavier Ducrohet
非常感谢。Stackoverflow上的大多数答案已经过时,显示了旧的解决方法。在Android Studio上需要做什么: 将文件放入src/main/jniLibs/xxx/*.so中, 右键单击项目结构中的文件夹并“同步”。 - John
1
如果*.so文件在一个库项目中,我该如何使用Gradle 0.9实现这个功能? - Fernando Gallego
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接