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)