Android StudioでGoogleTestを使用しようとしています。
私が理解したところによると、NDKの最新バージョンにはgtestが含まれています。
私はそれを行う方法の明確なガイドを見つけられませんでした。
私は this document:
そこで、新しいプロジェクトを開き、jniフォルダーと次のファイルを作成しました(私が書いたファイルの中に、ドキュメントとまったく同じものがあります)。
しかし、それは#include gtest/gtest.h
を認識しません
加えて、
cmakeを選択してexternalNativeBuildを駆動する場合(Android開発者 NDKガイド)によると、これが推奨されるオプションです )の場合、次の行を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. 、および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(int x、int y)関数をfoo.cppからテストするには(にできるだけ近づけます) NDK命令)、CMakeLists.txtスクリプトにさらにいくつかの行が必要です:
# build libfoo.so
add_library(foo SHARED src/main/jni/foo.cpp)
target_link_libraries(footest foo)
libfoo.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)
Alexの優れた答えに追加するために、CMakeLists.txt
に以下を追加することで、adb
を使用して結果のテストバイナリをデプロイして実行することもできます。
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
に依存していることに注意してください。これが、それをプッシュする理由です。 native-lib
へのパスは、LD_LIBRARY_PATH
環境変数を設定することによって指定されます。
みんなの答えをおんぶするために...ここのすべての解決策が100%うまくいったわけではありませんが、私はここのすべての答えを組み合わせて、私のために働く何かを得ました。ライブラリをCMakeでビルドしています。そのビルドは、Android Studioプラグインによって生成されます。GoogleTestsはbash
とadb
を介して直接実行されます。 。
警告:
add_executable(UnitTest "")
を使用して単体テストを作成し、そこにリンクする必要があります。${AS_STUDIO_LIBRARY_ROOT}/build/intermediates/cmake/${release|debug}/obj/${Arch}
はコンパイルされたソースを格納します。これには、共有ライブラリと他のライブラリ、および単体テストの実行可能ファイルが含まれている必要があります。この実行可能ファイルは最終的なAPKに到達しないため、心配する必要はありません。/data/local/tmp/<PROJECT_NAME>
に直接コピーしてからchmod 777
することは、特にPixel 2とエミュレーターでは、何らかの理由で機能しません:adb Push
リソース、ライブラリ、およびgoogletest実行可能ファイルを最初に/sdcard/<PROJECT_NAME>
フォルダーに移動しますadb Shell mv /sdcard/<PROJECT_NAME> /data/local/tmp/.
chmod 777 -R /data/local/tmp/<PROJECT_NAME>
これがすべて完了すると、次のようにgoogletestを実行できるようになります。
adb Shell LD_LIBRARY_PATH=/data/local/tmp/<PROJECT_NAME>; cd /data/local/tmp/<PROJECT_NAME>; ./<GOOGLE_TEST_EXECUTABLE>
また、Visual StudioCodeを介してgdbserver
およびgdb
を介してリモートデバッグを機能させました。代わりにlldb
を使用したいのですが、まだわかりません。完全なデバッグを機能させるためのこのトピックには複数の段落が必要になるため、Visual StudioCodeでlldb
を使用したり、この問題をどのように解決したか知りたい場合は、お気軽にPM PM $ === me 。
単体テストの実行後にファイルを削除することを忘れないでください。そうしないと、ファイルがデバイスに残ります。
私は基本的にアレックスコーンズアンサーを使用しました。 Ubuntu18-04。 Android studio内からビルドする必要があります。注stuidioの外部でcmakeを実行すると、現在のプラットフォームのビルドのみが取得されます。armeabiのビルドを制限する必要がありました。ターゲットシステムはこれで、静的ライブラリは静的にリンクしていたので、ビルドターゲットフットレストをダウンロードして実行するだけで済みました。これは基本的にAlex Cohnのファイルであり、2つの静的ライブラリをリンクするために追加されたファイルです。
# gtest setup
set(Android_NDK /home/labhras/Android/Sdk/ndk/20.0.5594570)
set(GOOGLETEST_ROOT ${Android_NDK}/sources/third_party/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)
# link_directories(~/AndroidStudioProjects/Nativecgtest/app/src/main/cpp)
add_library(libtsl.a STATIC IMPORTED)
set_target_properties(libtsl.a
PROPERTIES IMPORTED_LOCATION /home/labhras/AndroidStudioProjects/Nativecgtest/app/src/main/cpp/libtsl.a
INTERFACE_INCLUDE_DIRECTORIES /home/labhras/AndroidStudioProjects/Nativecgtest/app/src/main/cpp/libtsl.a
)
add_library(libtcl.a STATIC IMPORTED)
set_target_properties(libtcl.a
PROPERTIES IMPORTED_LOCATION /home/labhras/AndroidStudioProjects/Nativecgtest/app/src/main/cpp/libtcl.a
INTERFACE_INCLUDE_DIRECTORIES /home/labhras/AndroidStudioProjects/Nativecgtest/app/src/main/cpp/libtcl.a
)
add_executable(footest test2.cpp)
target_link_libraries(footest gtest libtsl.a libtcl.a)
App build.gradleのabiFilters行を使用して、ビルドをarmeabiに制限しました。
defaultConfig {
externalNativeBuild {
cmake {
abiFilters "armeabi-v7a"
}
}
}
CMakeまたはndk-build(Android.mk)を使用できますが、両方を使用することはできません。 NDKの最も優れた部分はCMakeのために配管されていません。 https://github.com/Android-ndk/ndk/issues/5