CMake: 変数「CMAKE_ANDROID_JAVA_SOURCE_DIR」でAndroid Java開発をスマートに


CMAKE_ANDROID_JAVA_SOURCE_DIR は、CMake の Android 用ターゲットプロパティで、Java ソースコードのルートディレクトリを指定するために使用されます。これは、Android 向けのネイティブライブラリやアプリケーションをビルドする際に役立ちます。

構文

set(CMAKE_ANDROID_JAVA_SOURCE_DIR "/path/to/java/sources;/another/path/to/java/sources")

説明

  • CMAKE_ANDROID_JAVA_SOURCE_DIR は、CMake バージョン 3.4 以降でのみ使用できます。
  • この変数は、ターゲットプロパティ ANDROID_JAVA_SOURCE_DIR のデフォルト値として使用されます。
  • 設定されたディレクトリは、CMake が Android 向けの Java コードを検索する場所になります。
  • CMAKE_ANDROID_JAVA_SOURCE_DIR は、セミコロンで区切られたディレクトリパスのリストを含む文字列プロパティです。

set(CMAKE_ANDROID_JAVA_SOURCE_DIR "/path/to/myproject/java/src;/path/to/myproject/java/libs")

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)

上記の例では、CMAKE_ANDROID_JAVA_SOURCE_DIR/path/to/myproject/java/src/path/to/myproject/java/libs の 2 つのディレクトリを指定します。add_executable コマンドは、my_app という名前の実行可能ファイルを作成し、my_app.cpp ファイルをビルドします。target_link_libraries コマンドは、jni ライブラリを my_app とリンクします。

  • CMake は、CMAKE_ANDROID_RES_DIR 変数を使用して、Android リソースファイルを検索する場所を指定することもできます。
  • CMake は、CMAKE_ANDROID_JAR_DIRECTORIES 変数を使用して、Java ライブラリ (.jar) ファイルを検索する場所を指定することもできます。
  • ANDROID_JAVA_SOURCE_DIR ターゲットプロパティは、個々のターゲットレベルで CMAKE_ANDROID_JAVA_SOURCE_DIR をオーバーライドするために使用できます。


cmake_minimum_required(VERSION 3.4)

project(my_app)

set(CMAKE_BUILD_TYPE Release)

set(CMAKE_TOOLCHAIN_FILE "path/to/android-cmake/cmake/android.toolchain.cmake")

set(CMAKE_ANDROID_NDK_ROOT "/path/to/android-ndk")

set(CMAKE_ANDROID_JAVA_SOURCE_DIR "/path/to/myproject/java/src")

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)

説明

  • jni ライブラリは my_app とリンクされます。
  • my_app という名前の実行可能ファイルが作成され、my_app.cpp ファイルがビルドされます。
  • この例では、CMAKE_ANDROID_JAVA_SOURCE_DIR 変数は /path/to/myproject/java/src ディレクトリに設定されています。

例 2: 複数の Java ソースディレクトリ

cmake_minimum_required(VERSION 3.4)

project(my_app)

set(CMAKE_BUILD_TYPE Release)

set(CMAKE_TOOLCHAIN_FILE "path/to/android-cmake/cmake/android.toolchain.cmake")

set(CMAKE_ANDROID_NDK_ROOT "/path/to/android-ndk")

set(CMAKE_ANDROID_JAVA_SOURCE_DIR "/path/to/myproject/java/src;/path/to/myproject/java/libs")

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)

説明

  • jni ライブラリは my_app とリンクされます。
  • my_app という名前の実行可能ファイルが作成され、my_app.cpp ファイルがビルドされます。
  • この例では、CMAKE_ANDROID_JAVA_SOURCE_DIR 変数は /path/to/myproject/java/src/path/to/myproject/java/libs の 2 つのディレクトリを指定します。

例 3: ターゲットプロパティ "ANDROID_JAVA_SOURCE_DIR" の使用

cmake_minimum_required(VERSION 3.4)

project(my_app)

set(CMAKE_BUILD_TYPE Release)

set(CMAKE_TOOLCHAIN_FILE "path/to/android-cmake/cmake/android.toolchain.cmake")

set(CMAKE_ANDROID_NDK_ROOT "/path/to/android-ndk")

set(ANDROID_JAVA_SOURCE_DIR "/path/to/myproject/java/src;/path/to/myproject/java/libs")

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)
  • jni ライブラリは my_app とリンクされます。
  • my_app という名前の実行可能ファイルが作成され、my_app.cpp ファイルがビルドされます。
  • この例では、ANDROID_JAVA_SOURCE_DIR ターゲットプロパティは my_app ターゲットに設定され、CMAKE_ANDROID_JAVA_SOURCE_DIR 変数の値をオーバーライドします。


代替方法

個々のターゲットプロパティを使用する

CMAKE_ANDROID_JAVA_SOURCE_DIR の代わりに、個々のターゲットプロパティ ANDROID_JAVA_SOURCE_DIR を使用できます。これは、ターゲットごとに異なる Java ソースディレクトリを指定したい場合に役立ちます。

set(ANDROID_JAVA_SOURCE_DIR "/path/to/target1/java/src")
add_executable(target1 target1.cpp)
target_link_libraries(target1 jni)

set(ANDROID_JAVA_SOURCE_DIR "/path/to/target2/java/src")
add_executable(target2 target2.cpp)
target_link_libraries(target2 jni)

CMakeLists.txt ファイル内のリストを使用する

CMAKE_ANDROID_JAVA_SOURCE_DIR の代わりに、CMakeLists.txt ファイル内に Java ソースディレクトリのリストを直接指定できます。

set(JAVA_SOURCE_DIRS "/path/to/source1;/path/to/source2")

list(APPEND CMAKE_ANDROID_JAVA_SOURCE_DIR ${JAVA_SOURCE_DIRS})

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)

外部変数を使用する

CMAKE_ANDROID_JAVA_SOURCE_DIR の代わりに、外部変数を使用して Java ソースディレクトリを指定できます。これは、CI/CD パイプラインやビルドスクリプトで使用する場合に役立ちます。

set(JAVA_SOURCE_DIR "/path/to/java/src")
external_set(JAVA_SOURCE_DIR "/path/to/java/src")

set(CMAKE_ANDROID_JAVA_SOURCE_DIR ${JAVA_SOURCE_DIR})

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)

キャッシュ機構を使用する

CMAKE_ANDROID_JAVA_SOURCE_DIR の代わりに、キャッシュ機構を使用して Java ソースディレクトリを指定できます。これは、ビルド時間を短縮する場合に役立ちます。

set(JAVA_SOURCE_DIR "/path/to/java/src")

if(NOT EXISTS "${JAVA_SOURCE_DIR}")
    message(FATAL_ERROR "Java source directory '${JAVA_SOURCE_DIR}' does not exist")
endif()

set(CMAKE_ANDROID_JAVA_SOURCE_DIR "${JAVA_SOURCE_DIR}")

add_executable(my_app my_app.cpp)
target_link_libraries(my_app jni)