2017-09-26 100 views
6

我想在Android Studio上使用GoogleTest。Android的NDK与谷歌测试

根据我的理解,最新版本的NDK包含gtest。

我没有找到明确的指导如何做到这一点。

我也跟着this文件:

于是,我开了一个新的项目,创造了JNI文件夹,以下文件(我写什么文档里面的文件):

enter image description here

但它不承认#include gtest/gtest.h

此外,

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

回答

5

如果选择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列表是由控制的abiFiltersbuild.gradle。在Android Studio中,即使ndk-build也会忽略设置在Application.mk中的APP_ABI。当您使用cmake的
  • 文件Android.mkApplication.mk被忽略。
  • 对于gradle-3.3classpath 'com.android.tools.build:gradle:2.3.3',如在当前Android Studio版本2.3.3中,您可能需要明确指定构建中的unittest目标。gradle这个

    android { defaultConfig { externalNativeBuild { cmake { targets "foo_unittest" }}}} 
    
  • 与Android 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) 

你会发现升ibfoo.so根据app/build/intermediates/cmake/debug/obj手动复制到您的设备。

为了减少麻烦,你可以使用STATIC代替SHARED,或简单地添加Foo.cpp中footest可执行:

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

谢谢!你帮了我很多!构建成功,但我找到的路径是:\ app \ .externalNativeBuild \ cmake \ debug \ x86 \ CMakeFiles \ footest.dir。而我没有libfoo.so文件。 我真的很抱歉,但从这里我不知道该怎么办......我可以得到更多的帮助吗? – ShiraOzeri

+0

够公平的,如果你不建立** libfoo.so **,它不会神奇地出现。要测试** foo.cpp **中的** foo(int x,int y)**函数,您需要在** CMakeLists.txt **脚本中添加更多行。我将这些添加到上面的答案中。 –

+0

非常感谢!那么,libfoo.so build.But在自述文件中写道,应该出现'libfoo.so'和'foo_unittest'这两个文件,并且我找不到'foo_unittest'文件 - 测试所在的位置。我试图在添加libfoo.so时添加文件,但是我没有成功。 – ShiraOzeri

0

您可以使用CMake的 NDK建造(Android.mk),而不是两个。对于CMake而言,最糟糕的部分NDK没有通过测试。 https://github.com/android-ndk/ndk/issues/500

+0

谢谢!那么如何将我在Android.mk上编写的内容添加到CMakeLists.txt? – ShiraOzeri

2

只需添加到Alex的出色答卷,也可以部署并通过添加运行使用adb产生的测试二进制以下到您CMakeLists.txt

find_program(ADB adb) 
add_custom_command(TARGET footest POST_BUILD 
    COMMAND ${ADB} shell mkdir -p /data/local/tmp/${ANDROID_ABI} 
    COMMAND ${ADB} push $<TARGET_FILE:native-lib> /data/local/tmp/${ANDROID_ABI}/ 
    COMMAND ${ADB} push $<TARGET_FILE:footest> /data/local/tmp/${ANDROID_ABI}/ 
    COMMAND ${ADB} shell \"export LD_LIBRARY_PATH=/data/local/tmp/${ANDROID_ABI}\; /data/local/tmp/${ANDROID_ABI}/footest\") 

请注意,在上面的示例中,footest依赖于共享库native-lib,这就是我们为什么要这么做的原因。通过设置LD_LIBRARY_PATH环境变量来指定到native-lib的路径。