たくさんの自由帳

Android の C++ で使う共有ライブラリを追加する

投稿日 : | 0 日前

文字数(だいたい) : 2545

どうもこんばんわ。うお~~買うぞ

dc

本題

Android向けにビルドした共有ライブラリ(ネイテイブライブラリ)を、AndroidアプリのC++コードから呼び出すほうほうです。
AndroidC++から、共有ライブラリ.soを呼び出す技。

ちなみに

共有ライブラリをJNI経由で呼び出す場合はこの記事は役に立たないと思います。
言語がRustだけどこっちのが役に立つはず。

環境

Android StudioAndroid Studio Narwhal Feature Drop 2025.1.2
Gradle8.12.0
CMake3.22.1

用意するもの

library

  • CPU向けにビルドした共有ライブラリのファイル.so
    • C++から呼び出したいやつ!
  • ヘッダーファイル

C++ コードを使えるようにする

新しいプロジェクトを作る画面で、Native C++を押しても良いのですが、
Android Studioには既存のプロジェクトにC++コードを追加できる環境を構築する機能があるので、こちらを使います。

つまり、あとから Jetpack Compose を入れるのはちょっとめんどいけど、あとから C++ コードを追加するのはボタンを何回か押すだけ。

もちろんNative C++からプロジェクトを作ってもいいですが、Jetpack Composeを使いたいなら手動でいれる必要があって、、

C++ コードを追加

ツールバーのFileからAdd C++ to Moduleをおして、あとはそのままOKで。

cpp1

こんな感じにcppフォルダと、CMakeLists.txtが生成されていればOK

cpp2

jniLibs フォルダの作成

Android Studioのファイルツリー表示をAndroidからFileにしたほうがいいかも)

app/src/mainjniLibsフォルダを作成します。
また、その中にCPU のアーキテクチャ(ABI)の名前でフォルダを作り、その中に使いたい共有ライブラリを入れます。

ARM 64bitならarm64-v8aってフォルダ名、x86-64用のライブラリならx86_64フォルダ名で。 めんどくさがってARM 64bitしか用意しなかったのでさみしい感じに()

ARM 64bitARM 32Bitx86-64x86の4つでそれぞれビルドしたライブラリを用意しないと、な気がします。

また、C++から書いて呼び出すためのヘッダーファイルですが、これも適当にjniLibsフォルダの中にincludeってフォルダを作って、その中に入れようと思います。
よって、こうなっているはず、

cpp3

CMakeLists.txt を書く

あとはこのライブラリがリンクされるように書いていきます。
が、何なのかよくわからないので全部張ります。

libuhdrは今回追加したライブラリの名前なので、そこは各自変えてください。
あとコメントにもある通り、Log.dC++から呼び出す場合は下2個書き足してください、

# ここから
# 今回追加したライブラリ名が libuhdr になっているので、そうしている
add_library(libuhdr SHARED IMPORTED)

set_target_properties(
        libuhdr
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libuhdr.so
)

include_directories(${CMAKE_SOURCE_DIR}/../jniLibs/include)

target_link_libraries(${CMAKE_PROJECT_NAME} libuhdr)

# Android の Log.d つかうなら以下2つ
find_library(log-lib log)
target_link_libraries(${CMAKE_PROJECT_NAME} ${log-lib})

これでGradle Syncすると、C++コードからライブラリが呼び出せるはずです。

cpp4

C++ から呼び出す

これで.cppからライブラリが呼び出せるようになったはずです。
やった~

// ヘッダーファイルが include できる
#include "ultrahdr_api.h"

void hello_world() {
    // ライブラリの関数が呼び出せた!!!!!
    auto encoder = uhdr_create_encoder();
    uhdr_release_encoder(encoder);
}

おわりに

次回はこれを使って遊ぶ予定です。

さんこうにしました