たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 2545
どうもこんばんわ。うお~~買うぞ
Android向けにビルドした共有ライブラリ(ネイテイブライブラリ)を、AndroidアプリのC++コードから呼び出すほうほうです。AndroidのC++から、共有ライブラリ.soを呼び出す技。
共有ライブラリをJNI経由で呼び出す場合はこの記事は役に立たないと思います。
言語がRustだけどこっちのが役に立つはず。
| Android Studio | Android Studio Narwhal Feature Drop 2025.1.2 |
| Gradle | 8.12.0 |
| CMake | 3.22.1 |
CPU向けにビルドした共有ライブラリのファイル.soC++から呼び出したいやつ!新しいプロジェクトを作る画面で、Native C++を押しても良いのですが、Android Studioには既存のプロジェクトにC++コードを追加できる環境を構築する機能があるので、こちらを使います。
つまり、あとから Jetpack Compose を入れるのはちょっとめんどいけど、あとから C++ コードを追加するのはボタンを何回か押すだけ。
もちろんNative C++からプロジェクトを作ってもいいですが、Jetpack Composeを使いたいなら手動でいれる必要があって、、
ツールバーのFileからAdd C++ to Moduleをおして、あとはそのままOKで。
こんな感じにcppフォルダと、CMakeLists.txtが生成されていればOK
(Android Studioのファイルツリー表示をAndroidからFileにしたほうがいいかも)
app/src/mainにjniLibsフォルダを作成します。
また、その中にCPU のアーキテクチャ(ABI)の名前でフォルダを作り、その中に使いたい共有ライブラリを入れます。
ARM 64bitならarm64-v8aってフォルダ名、x86-64用のライブラリならx86_64フォルダ名で。
めんどくさがってARM 64bitしか用意しなかったのでさみしい感じに()
ARM 64bit、ARM 32Bit、x86-64、x86の4つでそれぞれビルドしたライブラリを用意しないと、な気がします。
また、C++から書いて呼び出すためのヘッダーファイルですが、これも適当にjniLibsフォルダの中にincludeってフォルダを作って、その中に入れようと思います。
よって、こうなっているはず、
あとはこのライブラリがリンクされるように書いていきます。
が、何なのかよくわからないので全部張ります。
libuhdrは今回追加したライブラリの名前なので、そこは各自変えてください。
あとコメントにもある通り、Log.dをC++から呼び出す場合は下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++コードからライブラリが呼び出せるはずです。
これで.cppからライブラリが呼び出せるようになったはずです。
やった~
// ヘッダーファイルが include できる
#include "ultrahdr_api.h"
void hello_world() {
// ライブラリの関数が呼び出せた!!!!!
auto encoder = uhdr_create_encoder();
uhdr_release_encoder(encoder);
}次回はこれを使って遊ぶ予定です。