2017-09-26 43 views
6

Próbuję użyć GoogleTest w Android Studio.Android NDK z testem Google

Zgodnie z tym, co zrozumiałem, najnowsza wersja NDK zawiera tytuł gtest.

Nie znalazłem jasnego przewodnika, jak to zrobić.

Śledziłem this dokument:

Więc otworzył nowy projekt, utworzony folder JNI oraz następujące pliki (wewnątrz plików napisałem dokładnie to, co dokument):

enter image description here

Ale nie rozpoznaje #include gtest/gtest.h

Ponadto

  • jak uruchomić adb na końcu?
  • Utworzono plik android.mk, ale gdzie powinienem go nazwać?

Odpowiedz

5

Jeśli zdecydujesz cmake do kierowania externalNativeBuild (i jest to preferowana opcja, zgodnie z Android Developers NDK guide), to można po prostu dodać następujące linie do swojego 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) 

Jeśli twoja kompilacja się powiedzie, znajdziesz app/.externalNativeBuild/cmake/debug/x86/footest. Stąd możesz wykonać instrukcje w README.NDK, aby uruchomić go na emulatorze lub urządzeniu.


Uwagi:

  • upewnić, że ABI dopasowuje cel użyć (podręcznik nie jest bardzo wyraźnie o tym).
  • Lista ABI, które są budowane, jest kontrolowana przez abiFilters w build.gradle. W Androidzie Studio nawet ndk-build ignoruje ustawienia APP_ABI ustawione w Application.mk.
  • pliki Android.mk i Application.mk są ignorowane podczas korzystania cmake.
  • dla gradle-3.3 i classpath 'com.android.tools.build:gradle:2.3.3', tak jak w bieżącej wersji Androida Studio 2.3.3, może być konieczne jednoznaczne określenie celu unittest w wersji .Gradle:

    android { defaultConfig { externalNativeBuild { cmake { targets "foo_unittest" }}}} 
    
  • z Android Studio 3.0, gradle-4.1 i classpath 'com.android.tools.build:gradle:3.0.0-beta6' wykonywalny jest łatwiej znaleźć pod app/build/intermediates/cmake/debug/obj.


Aby przetestować foo (int x, int y) funkcji z foo.cpp w udostępnionej biblioteki (aby zrobić to jak najbardziej zbliżone do NDK instructions), Państwo potrzebuję więcej linii w swojej CMakeLists.txt skryptu:

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

znajdziesz l ibfoo.so, aby skopiować ręcznie na urządzenie pod numerem app/build/intermediates/cmake/debug/obj.

Aby zmniejszyć kłopotów, można użyć STATIC zamiast SHARED, lub po prostu dodać foo.cpp do footest wykonywalny:

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

Dzięki! Bardzo mi pomogłeś! Kompilacja się powiodła, ale znajduję się następująca ścieżka: \ app \ .externalNativeBuild \ cmake \ debug \ x86 \ CMakeFiles \ footest.dir. i nie mam pliku libfoo.so. Bardzo mi przykro, ale stąd nie wiem, co robić ... Czy mogę uzyskać więcej pomocy od ciebie? – ShiraOzeri

+0

Wystarczająco fair, jeśli nie zbudujesz ** libfoo.so **, nie pojawi się on tylko magicznie. Aby przetestować funkcję ** foo (int x, int yy) ** z ** foo.cpp **, potrzebujesz więcej linii w swoim skrypcie ** CMakeLists.txt **. Dodaję je do powyższej odpowiedzi. –

+0

Wielkie dzięki! Cóż, libfoo.so build .Ale w README napisano, że powinny pojawić się oba pliki: 'libfoo.so' i 'foo_unittest', i nie mogę znaleźć pliku "foo_unittest" - gdzie znajdują się testy. Próbowałem dodać plik podczas dodawania libfoo.so, ale mi się nie udało. – ShiraOzeri

2

Wystarczy dodać do doskonałej odpowiedzi Aleksa, można również wdrożyć i uruchomić wynikowy plik binarny z badań przeprowadzonych przy adb przez dodanie następujących do 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\") 

Należy zauważyć, że w powyższym przykładzie footest jest zależny od biblioteki współużytkowanej native-lib i dlatego ją popychamy. Ścieżkę do native-lib określa się, ustawiając zmienną środowiskową LD_LIBRARY_PATH.