c++ - Android NDK 与谷歌测试

标签 c++ android-studio gradle android-ndk googletest

我正在尝试在 Android Studio 上使用 GoogleTest。

据我了解,最新版的NDK已经包含了gtest。

我没有找到明确的指南如何去做。

我关注了this文档:

因此,我打开了一个新项目,创建了 jni 文件夹和以下文件(文件里面我写的正是文件内容):

enter image description here

但它不识别#include gtest/gtest.h

此外,

  • 最后如何运行adb?
  • 我创建了一个 android.mk 文件,但我应该在哪里调用它?

最佳答案

如果您选择 cmake 来驱动您的 externalNativeBuild(根据 Android 开发人员的说法,这是首选选项 NDK guide),那么您只需添加以下行到您的 CMakeLists.txt:

set(GOOGLETEST_ROOT ${ANDROID_NDK}/sources/third_party/googletest/googletest)
add_library(gtest STATIC ${GOOGLETEST_ROOT}/src/gtest_main.cc ${GOOGLETEST_ROOT}/src/gtest-all.cc)
target_include_directories(gtest PRIVATE ${GOOGLETEST_ROOT})
target_include_directories(gtest PUBLIC ${GOOGLETEST_ROOT}/include)

add_executable(footest src/main/jni/foo_unittest.cc)
target_link_libraries(footest gtest)

如果构建成功,您会发现 app/.externalNativeBuild/cmake/debug/x86/footest .从这里,您可以按照 README.NDK 中的说明进行操作。在模拟器或设备上运行它。


注释:

  • 确保 ABI 与您使用的目标匹配(指南对此不是很清楚)。
  • 构建的 ABI 列表由 build.gradle 中的 abiFilters 控制。在 Android Studio 中,甚至 ndk-build 也会忽略 Application.mk 中设置的 APP_ABI。
  • 当您使用 cmake 时,文件 Android.mkApplication.mk 将被忽略。
  • gradle-3.3 , 和 classpath 'com.android.tools.build:gradle:2.3.3' ,在当前的 Android Studio 版本 2.3.3 中,您可能需要在 build.gradle 中明确指定单元测试目标:

    android { defaultConfig { externalNativeBuild { cmake { targets "foo_unittest" }}}}
    
  • 使用 Android Studio 3.0,gradle-4.1 , 和 classpath 'com.android.tools.build:gradle:3.0.0-beta6'app/build/intermediates/cmake/debug/obj 下更容易找到可执行文件.


在共享库中测试 foo.cpp 中的 foo(int x, int y) 函数(尽可能接近 NDK instructions ),您的 CMakeLists.txt 脚本中需要更多行:

# build libfoo.so
add_library(foo SHARED src/main/jni/foo.cpp)
target_link_libraries(footest foo) 

您会在app/build/intermediates/cmake/debug/obj 下找到libfoo.so 手动复制到您的设备上.

为了减少麻烦,您可以使用STATIC而不是 SHARED ,或者简单地将 foo.cpp 添加到 footest 可执行文件中:

add_executable(footest src/main/jni/foo_unittest.cc src/main/jni/foo.cpp)

关于c++ - Android NDK 与谷歌测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429958/

相关文章:

c++ - 霍夫曼压缩读取文件不复制二进制文件c++中的所有字节

Android布局: fragment with listview layout is not fullscreen

flutter - 错误 "To set up CocoaPods for ARM macOS, run: arch -x86_64 sudo gem install ffi Unable to solve error"

android-studio - 人工发布不适用于android studio 3.4.1

java - 如何创建由 gradle 预编译运行的注释处理器以将代码添加到方法中?

c++ - 具有虚函数的类的大小 GCC/Xcode

c++ - 如何使用 QTcp-Server 套接字创建 HTTP MJPEG 流媒体服务器?

c++ - 如何找到 -lm lib 并将其包含在 CMake 中?

java - IF 语句给出无法解析 PDFDocument 中的符号

gradle - Kotlin Gradle插件:apiVersion与languageVersion