在Android Studio中使用NDK和外部C++源代码

3
到目前为止,我在使用Android Studio的NDK方面已经有了一些实践,我写了Java包装器、生成了头文件,并在JNI文件夹中填写了一些对应的C++函数。
现在我正在尝试构建一个简单的版本,以便验证一切是否正常。我的项目依赖于一些位于整个Android项目之外的C++源文件。我该如何从Android内部构建这些源文件?我该如何访问它们?我需要从Gradle做什么吗?
我对构建跨多个源代码的项目非常陌生,所以我不知道该怎么做。如果问题不清楚,请原谅。非常感谢任何帮助。

如果您正在Windows上开发,您将需要使用NDK单独构建项目,并将.so文件放置在每个架构的项目文件夹下面的文件夹中,否则您可以使用Gradle来完成所有操作。这应该有助于指导您的研究工作。无论如何,您都必须为NDK创建一个Android.mk和一个Application.mk;OpenCV-android-sdk中的人脸检测示例应该有助于了解如何准备使用NDK进行构建。 - mstrthealias
我一定会看一下OpenCV-android-sdk的示例,谢谢! - bhbbby
我实际上是在 Mac 上进行开发,这会对你所描述的有很大的不同吗? - bhbbby
当您使用Mac时,应该能够使用Gradle来构建带有NDK的jni源代码。 - mstrthealias
1个回答

4

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

该网页作者ph0b在NDK方面有多篇SO帖子。

请阅读此人关于AS+NDK主题的各种帖子。

IMO-您可以遵循“导入NDK项目”策略,从用于eclipse/NDK android项目的src目录中导入,并使用常规的“文件/导入项目”对话框导入AS 0.8.+。

导入完成后,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"任务。


哇,太棒了@Robert!感谢提供链接(:我实际上正在尝试使用一堆未为ndk编写的cpp文件,但作为跨平台开发的库。我该如何从ndk中访问这些文件? - bhbbby
在NDK下载中查找示例,查看文档并构建它们。这就是学习JNI接口的方法。 - Robert Rowntree
@RobertRowntree 我认为你没有理解 OP 的问题。如果我说我想要外部本地源代码,那么意味着 我不想将它们导入到 Android 项目中,因为这样做,这些源代码每次更改都需要重新导入。例如,我正在开发一个跨平台的本地代码库,需要部署到 iOS/XCode 和 Android/Studio 上,我的本地代码经常变化。所以我认为你可以看到,在 OP 的情况下,导入并没有帮助。 - Engineer

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