【保存版】Androidアプリ開発におけるCMakeのANDROID_ASSETS_DIRECTORIES:アセットを扱うための詳細ガイド


ANDROID_ASSETS_DIRECTORIES は CMake のターゲットプロパティであり、Android アプリケーションビルド時に assets フォルダにコピーするディレクトリを指定するために使用されます。assets フォルダは、画像、サウンド、テキストファイルなど、アプリケーションに必要な静的データを含む場所です。

構文

set_property(TARGET <target> PROPERTY ANDROID_ASSETS_DIRECTORIES "<dir1>;<dir2>;...;<dirN>")
  • <dir1>, <dir2>, ..., <dirN> は、assets フォルダにコピーするディレクトリのパスです。各パスはセミコロンで区切ります。
  • <target> は、ANDROID_ASSETS_DIRECTORIES プロパティを設定するターゲットの名前です。

set(MY_APP_ASSETS_DIR "${PROJECT_SOURCE_DIR}/assets")

set_property(TARGET my_app PROPERTY ANDROID_ASSETS_DIRECTORIES "${MY_APP_ASSETS_DIR}")

この例では、my_app という名前のターゲットに ANDROID_ASSETS_DIRECTORIES プロパティを設定しています。このプロパティは、assets フォルダに PROJECT_SOURCE_DIR/assets ディレクトリの内容をコピーするように設定します。

  • assets フォルダ内のファイルは、アプリケーションコードから直接アクセスできます。
  • assets フォルダは、アプリケーションパッケージのルートディレクトリにあります。
  • ANDROID_ASSETS_DIRECTORIES プロパティは、CMake バージョン 3.4 以降でのみ使用できます。
  • assets フォルダとリソースディレクトリの違いは、assets フォルダは静的データのみを格納するのに対し、リソースディレクトリは XML ファイル、レイアウトファイル、描画可能なファイルなど、さまざまな種類のファイルを格納できることです。
  • ANDROID_ASSETS_DIRECTORIES プロパティに加えて、ANDROID_RES_DIRECTORIES プロパティを使用して、Android アプリケーションのリソースディレクトリを指定することもできます。


cmake_minimum_required(VERSION 3.4)

project(my_app)

set(PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(MY_APP_ASSETS_DIR "${PROJECT_SOURCE_DIR}/assets")

set(MY_APP_IMAGES_DIR "${MY_APP_ASSETS_DIR}/images")
set(MY_APP_SOUNDS_DIR "${MY_APP_ASSETS_DIR}/sounds")

# アプリケーションのソースコードをビルド
add_executable(my_app main.cpp)

# Android アプリケーションに必要なライブラリをリンク
target_link_libraries(my_app android)

# assets フォルダに画像とサウンドファイルをコピー
set_property(TARGET my_app PROPERTY ANDROID_ASSETS_DIRECTORIES "${MY_APP_IMAGES_DIR};${MY_APP_SOUNDS_DIR}")

このコードでは、以下のことが行われています。

  1. CMake のバージョン要件を 3.4 に設定します。
  2. プロジェクトの名前を my_app に設定します。
  3. プロジェクトのソースディレクトリと、assets フォルダを含むアセットディレクトリのパスを設定します。
  4. 画像とサウンドファイル用のサブディレクトリを作成します。
  5. my_app という名前のターゲットを作成し、メインの C++ ファイル main.cpp をビルドするように設定します。
  6. アプリケーションに必要な Android ライブラリをターゲットにリンクします。
  7. ANDROID_ASSETS_DIRECTORIES プロパティを使用して、imagessounds サブディレクトリの内容を assets フォルダにコピーするように設定します。

このコードをビルドするには、次のコマンドを実行します。

cmake .
make


add_custom_command を使用する

add_custom_command コマンドを使用して、assets フォルダにファイルをコピーするカスタムコマンドを作成できます。 この方法は、より柔軟な制御を提供しますが、ANDROID_ASSETS_DIRECTORIES プロパティよりも複雑になる可能性があります。


add_custom_command(
  TARGET my_app
  PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory ${MY_APP_ASSETS_DIR} ${CMAKE_CURRENT_BINARY_DIR}/assets
)

この例では、my_app ターゲットのビルド前に、MY_APP_ASSETS_DIR ディレクトリの内容を assets フォルダにコピーするカスタムコマンドを作成しています。

長所

  • 複雑なコピー操作を実行するために使用できます。
  • より柔軟な制御を提供します。

短所

  • CMake バージョン 3.1 以降でのみ使用できます。
  • ANDROID_ASSETS_DIRECTORIES プロパティよりも複雑です。

install コマンドを使用する

install コマンドを使用して、assets フォルダにファイルをインストールすることもできます。 この方法は、シンプルですが、ANDROID_ASSETS_DIRECTORIES プロパティよりも柔軟性に欠けます。


install(
  DIRECTORY ${MY_APP_ASSETS_DIR}
  DESTINATION ${CMAKE_INSTALL_PREFIX}/assets
)

この例では、MY_APP_ASSETS_DIR ディレクトリの内容を CMAKE_INSTALL_PREFIX/assets フォルダにインストールしています。

長所

  • CMake の古いバージョンでも使用できます。
  • シンプルです。

短所

  • インストールプロセスの一部としてファイルがコピーされるため、ビルドプロセスが遅くなる可能性があります。
  • ANDROID_ASSETS_DIRECTORIES プロパティよりも柔軟性に欠けます。

手動でファイルをコピーする

最後の手段として、手動でファイルを assets フォルダにコピーすることもできます。 これは、プロジェクトが小さくてシンプルな場合にのみ推奨されます。

長所

  • 最もシンプルです。
  • プロジェクトが大きくなると、管理が難しくなります。
  • 時間がかかり、エラーが発生しやすいです。