👀

【雑記】AndroidStudioでC言語ライブラリを単体ビルドする

2024/11/01に公開

はじめに

この記事ではAndroidStudioを使い、Android向けにC言語ライブラリをビルドする手順を説明します。
結論から書くと、Build>Make Moduleを実行することで、gradlewスクリプトが実行されライブラリが生成されます。

ライブラリの構成

今回ビルドするライブラリの構成は以下のようなものとします。
libhogelibfugaに依存しており、同時にビルドするものとします。

libhoge
├─ libfuga
│   ├─ include
│   │   └─ fugafuga.h
│   └─ src
│       └─ fugafuga.c
├─ include
│   └─ hogehoge.h
└─ src
    └─ hogehoge.c

プロジェクトの構成

上記のライブラリをビルドするためのプロジェクトの最小構成は以下のようになります。
★がついているファイルはAndroidStudioのテンプレートに含まれているため、「No Activity」のテンプレートを使用し、不必要なファイルを削除すると楽です

hoge-android-lib
├─ gradle // ★ ディレクトリの中身の含めて追加
├─ libhoge
│   ├─ libfuga
│   │   ├─ include
│   │   │   └─ fugafuga.h
│   │   ├─ src
│   │   │   └─ fugafuga.c
│   │   └─ CMakeLists.txt // 追加
│   ├─ include
│   │   └─ hogehoge.h
│   ├─ src
│   │   └─ hogehoge.c
│   ├─ build.gradle.kts // 追加
│   └─ CMakeLists.txt // 追加
├─ build.gradle.kts // ★ 追加
├─ gradle.properties // ★ 追加
├─ gradlew // ★ 追加
├─ gradlew.bat // ★ 追加
├─ local.properties // ★ 追加
└─ settings.gradle.kts // ★ 追加

各ファイルの内容

特に変更の必要なファイルのみを書きます。
今回の例では共有ライブラリをビルドする場合の設定となっています。

settings.gradle.kts

/* 他の設定 */
rootProject.name = "hoge-android-lib"
include(":libhoge") // ライブラリのディレクトリ(build.gradle.ktsのあるディレクトリ)を指定
// include(":app")は必要ないためディレクトリごと削除

libhoge/build.gradle.kts

plugins {
    /* AndroidLibraryPluginなどを追加 */
}

android {
    namespace = "cpm.example.hoge"
    compileSdk = 34

    defaultConfig {
        minSdk = 30
    }

    externalNativeBuild {
        cmake {
            path("CMakeLists.txt") // CMakeLists.txtのディレクトリを指定
        }
    }

    buildTypes {
        /* 省略 */
    }
}

libhoge/CMakeLists.txt

project(Hoge VERSION 1.0)

# ライブラリファイルの出力先 アーキテクチャごとに出力
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../build/libs/${CMAKE_ANDROID_ARCH_ABI}")

# ヘッダーファイルの出力先
set(HOGE_INCLUDE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/../build/include")

# 出力ディレクトリを作成しておく
file(MAKE_DIRECTORY ${LEDA_INCLUDE_OUTPUT_DIRECTORY})

# libfugaも同時にビルド
add_subdirectory(libfuga)

# ソースファイル
add_library(hoge SHARED
        src/hogehoge.c
)

# ヘッダーファイルディレクトリ
target_include_directories(hoge PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/libfuga/include
)

# libfugaをリンク
target_link_libraries(hoge PUBLIC fuga)

# ヘッダーファイルを出力ディレクトリにコピー
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/include/"
        DESTINATION ${HUGE_INCLUDE_OUTPUT_DIRECTORY}
        FILES_MATCHING PATTERN "*.h"
)

libfuga/CMakeLists.txt

project(Fuga VERSION 1.0)

# ソースファイル
add_library(fuga SHARED
        src/fugafuga.c
)

# ヘッダーファイルディレクトリ
target_include_directories(fuga PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# ヘッダーファイルを出力ディレクトリにコピー
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/include/"
        DESTINATION ${HOGE_INCLUDE_OUTPUT_DIRECTORY}
        FILES_MATCHING PATTERN "*.h"
)

ビルド方法

横メニューのプロジェクトタブを選択し、上部メニューのBuild>Make Module hoge-android-lib.libhoge.mainを実行します。
すると、gradlewスクリプト>CMakeと実行され、出力ディレクトリにヘッダーファイルとライブラリが生成されます。

hoge-android-lib
└─ build
    ├─ include
    │   ├─ hogehoge.h
    │   └─ fugafuga.h
    └─ libs
        ├─ arm64-v8a
        │   ├─ libhoge.so
        │   └─ libfuga.so
        ├─ armeabi-v7a
        │   ├─ libhoge.so
        │   └─ libfuga.so
        ├─ x86
        │   ├─ libhoge.so
        │   └─ libfuga.so
        └─ x86_64
            ├─ libhoge.so
            └─ libfuga.so

備考

この記事の内容は以下の環境で確認されました。

  • AndroidStudio Koala | 2024.1.1
  • AndroidNDK 28.0.12433566 rc1
  • Gradle 8.7

Discussion