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)
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
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. –
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