たくさんの自由帳
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
向けにビルドした共有ライブラリのファイル.so
C++
から呼び出したいやつ!新しいプロジェクトを作る画面で、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);
}
次回はこれを使って遊ぶ予定です。