【问题标题】:Using NDK in Android Studio with outside C++ sources在带有外部 C++ 源代码的 Android Studio 中使用 NDK
【发布时间】:2014-11-29 01:49:59
【问题描述】:

到目前为止,在我尝试将 NDK 与 Android Studio 结合使用时,我已经编写了 Java Wrapper,生成了头文件,并在 JNI 文件夹中相应的 c++ 文件中填充了一些函数。

我现在要做的是进行一个简单的构建,以便我可以验证一切是否正常。我的项目依赖于我的整个 android 项目之外的一些 c++ 源文件。我是否从 Android 内部以某种方式构建这些源文件?我如何访问它们?我需要从 Gradle 做些什么吗?

我对跨多个来源构建项目非常陌生,所以我不知道该怎么做。如果问题没有意义,请道歉。非常感谢任何帮助(:

【问题讨论】:

  • 如果你在 Windows 中开发,你必须使用 NDK 单独构建项目,并将项目中的 .so 文件放在每个架构的文件夹下,否则你可以使用 Gradle 来做一切。这应该有助于指导您的研究工作。在任何情况下,您都必须为 NDK 创建一个 Android.mk 和一个 Application.mk; OpenCV-android-sdk 中的人脸检测示例应该有助于理解如何准备使用 NDK 进行构建。
  • 我一定会看看OpenCV-android-sdk的例子;谢谢!
  • 我实际上是在 Mac 上开发的,这是否与您描述的巨人有所不同?
  • 在使用 Mac 时,您应该能够使用 Gradle 通过 NDK 构建 jni 源代码。

标签: android c++ android-ndk android-studio java-native-interface


【解决方案1】:

http://ph0b.com/android-studio-gradle-and-ndk-integration/

用户 ph0b 在 NDK 上有很多 SO 帖子。

阅读此人在主题(AS + NDK)上的各种帖子

IMO - 您可以从用于 eclipse/NDK android 项目的 src 目录中遵循策略“导入 NDK proj”,而 AS 0.8.+ 将通过正常的“文件/导入项目”对话框让您几乎一路走到那里。

AS导入完成后,NDK的东西会在:

./root/module/src/main/jni

Java 包将在

./root/module/src/main/java

验证导入到 AS 没有对您输入到导入过程的“Android.mk”文件进行自动更新,因为您将需要它而不是任何自动生成的文件来自 AS。

在 AS gradle.build 文件中 ...

确定

buildToolsVersion "19.1.0"

并根据之前的链接添加以下内容:

   ndk {
        moduleName "audioboo-ogg"
    }
}
flavorDimensions "abi"
productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
        }
    }
    armv7 {
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
}
sourceSets {
    main {
        jni.srcDirs = [] /*disable automatic ndk-build call */
    }

}

task ndkBuild(type: Exec) {
    commandLine '$NDK_HOME/android-ndk-r9[a-z]/ndk-build', '-C', file('src/main/jni').absolutePath
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

然后您可以选择在 jni 文件夹中进行 CLI NDK 构建,或者仅使用 gradle 集成构建,该构建将使用 gradle 文件中的“ndkBuild”任务。

【讨论】:

  • 哇,太棒了@罗伯特!感谢您的链接(:我实际上是在尝试使用不是为 ndk 编写的一堆 cpp 文件,而是作为跨平台开发的库。我将如何使用 ndk 访问这些文件?跨度>
  • 在 ndk 下载中查找 NDK 示例,查看文档并构建它们。这就是学习jni接口的方法
  • @RobertRowntree 我认为您不理解 OP 的问题。如果我说我想要外部原生源,这意味着我不希望将它们导入到 Android 项目中,因为这样做,每次更改时都需要重新导入这些源。例如,我正在开发一个跨平台的原生代码库,需要同时为 iOS/XCode 和 Android/Studio 部署,而我的原生代码在不断变化。所以我认为你可以看到导入对 OP 的情况没有帮助。
猜你喜欢
  • 2013-03-23
  • 2016-07-02
  • 2017-07-24
  • 2015-04-26
  • 2020-03-06
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多