随着 Android Studio 更新到 1.0,NDK 工具链支持得到了极大的改进(注意:请阅读本文底部的更新,以了解新的实验性 Gradle 插件和 Android Studio 1.5 的使用情况)。
Android Studio 和 NDK 集成得很好,因此您只需在模块的 build.gradle 中创建一个 ndk{} 块,并将源文件设置到 (module)/src/main/jni 目录 - 和你完成了!
不再需要从命令行进行 ndk-build。
我已经在我的博文中写了所有关于它的内容:http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
重点是:
这里有两件事你需要知道。默认情况下,如果您希望将外部库加载到 Android 应用程序中,则默认情况下会在 (module)/src/main/jniLibs 中查找它们。您可以通过在模块的 build.gradle 中设置 sourceSets.main.jniLibs.srcDirs 来更改此设置。您需要一个子目录,其中包含您所针对的每个架构的库(例如 x86、arm、mips、arm64-v8a 等……)
您希望通过 NDK 工具链默认编译的代码将位于 (module)/src/main/jni 和上面类似,您可以通过在模块的 sourceSets.main.jni.srcDirs 中设置来更改它build.gradle
并将其放入模块的 build.gradle 中:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
这是编译你的 C++ 代码的过程,你需要从那里加载它,并创建包装器 - 但从你的问题来看,你已经知道如何做所有这些,所以我不会重新散列。
另外,我在此处放置了此示例的 Github 存储库:http://github.com/sureshjoshi/android-ndk-swig-example
更新日期:2015 年 6 月 14 日
当 Android Studio 1.3 出来时,应该会通过 JetBrains CLion 插件对 C++ 提供更好的支持。我目前假设这将允许在 Android Studio 内进行 Java 和 C++ 开发;但是我认为我们仍然需要使用 Gradle NDK 部分,如上所述。此外,我认为仍然需要编写 JavaC++ 包装文件,除非 CLion 会自动执行这些操作。
更新日期:2016 年 1 月 5 日
我已更新我的博客和 Github 存储库(在开发分支中)以使用带有最新实验性 Gradle 插件 (0.6.0-alpha3) 的 Android Studio 1.5。
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
NDK 部分的 Gradle 构建现在如下所示:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
此外,非常棒的是,Android Studio 使用“native”关键字自动完成 C++-Java 生成的包装器:
然而,它并不完全乐观......如果你使用 SWIG 包装一个库来自动生成代码,然后尝试使用 native 关键字自动生成,它会将代码放在错误的位置你的 Swig _wrap.cxx 文件...所以你需要将它移动到“extern C”块中:
更新日期:2017 年 10 月 15 日
如果我没有提到 Android Studio 2.2 及更高版本通过 Gradle 和 CMake 对 NDK 工具链具有本质上的“本机”(无双关语)支持,那将是我的疏忽。现在,当您创建一个新项目时,只需选择 C++ 支持就可以了。
您仍然需要生成自己的 JNI 层代码,或者使用我上面提到的 SWIG 技术,但现在在 Android 项目中搭建 C++ 的脚手架是微不足道的。
Android Studio 将获取 CMakeLists 文件(放置 C++ 源文件的位置)中的更改,并自动重新编译任何关联的库。