我想在Android Studio上使用GoogleTest。Android的NDK与谷歌测试
根据我的理解,最新版本的NDK包含gtest。
我没有找到明确的指导如何做到这一点。
我也跟着this文件:
于是,我开了一个新的项目,创造了JNI文件夹,以下文件(我写什么文档里面的文件):
但它不承认#include gtest/gtest.h
此外,
- 如何在最后运行adb?
- 我创建了一个android.mk文件,但我应该在哪里调用它?
我想在Android Studio上使用GoogleTest。Android的NDK与谷歌测试
根据我的理解,最新版本的NDK包含gtest。
我没有找到明确的指导如何做到这一点。
我也跟着this文件:
于是,我开了一个新的项目,创造了JNI文件夹,以下文件(我写什么文档里面的文件):
但它不承认#include gtest/gtest.h
此外,
如果选择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中的说明在仿真器或设备上运行它。
注:
对于gradle-3.3和classpath '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)
您可以使用CMake的或 NDK建造(Android.mk),而不是两个。对于CMake而言,最糟糕的部分NDK没有通过测试。 https://github.com/android-ndk/ndk/issues/500
谢谢!那么如何将我在Android.mk上编写的内容添加到CMakeLists.txt? – ShiraOzeri
只需添加到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
的路径。
谢谢!你帮了我很多!构建成功,但我找到的路径是:\ app \ .externalNativeBuild \ cmake \ debug \ x86 \ CMakeFiles \ footest.dir。而我没有libfoo.so文件。 我真的很抱歉,但从这里我不知道该怎么办......我可以得到更多的帮助吗? – ShiraOzeri
够公平的,如果你不建立** libfoo.so **,它不会神奇地出现。要测试** foo.cpp **中的** foo(int x,int y)**函数,您需要在** CMakeLists.txt **脚本中添加更多行。我将这些添加到上面的答案中。 –
非常感谢!那么,libfoo.so build.But在自述文件中写道,应该出现'libfoo.so'和'foo_unittest'这两个文件,并且我找不到'foo_unittest'文件 - 测试所在的位置。我试图在添加libfoo.so时添加文件,但是我没有成功。 – ShiraOzeri