はじめに
本記事は下記の続き(リベンジ)です。
Xamarin.Forms(Android) から OpenCV(C/C++) を利用する
前回はOpenCV公式の Android 用ライブラリを Xamarin から使用しました。
今回はソースコードをセルフビルドして Android 用の共有ライブラリ(*.so) を作成します。
類型的ですが、ライブラリのセルフビルドには以下のメリットがあります。
-
モジュール(機能)を絞ることでライブラリのファイルサイズを減らせる
-
拡張モジュール群(opencv_contrib)をライブラリに含められる
確認環境
- OpenCV 4.2.0
- Windows 10
- CMake 3.16.2
- MinGW 8.2.0-5
- Android SDK 28.0.3
- Android NDK 20.0.5594570
環境構築
まずはビルドに必要なツールを導入していきます。OpenCV の入手は割愛します。
-
CMake
-
MinGW
-
Android SDK / NDK
CMake
ココ の Latest Release (3.16.2) をインストールしました。
MinGW
ココ のインストーラ (mingw-get-setup.exe) を使い、以下の設定でインストールしました。
インストールが完了したら 環境変数 PATH に binフォルダのパスを通しておきます。 ポイント
Android SDK / NDK
最後に Android SDK と NDK をインストールするため、ココ からAndroid SDK Command line tools を取得します。
(Android Studio をインストールされている方は、そちらからインストールすると良いと思います)
次に SDK / NDK をインストールします。今回は C:\dev\android-sdk\tools に解凍しました。
$ cd C:\dev\android-sdk\tools\bin
$ .\sdkmanager.bat --update
$ .\sdkmanager.bat --list # パッケージの一覧表示
表示されたリストを見て SDK / NDK のバージョンを指定します。
今回は(VisualStudio に合わせて)以下のバージョンを選択しました。
$ .\sdkmanager.bat "build-tools;28.0.3" # SDK
$ .\sdkmanager.bat "ndk;20.0.5594570" # NDK
それぞれ C:\dev\android-sdk 以下のディレクトリにインストールされます。
後工程の CMake Generate にて、android.toolchain.cmake の設定と NDK 内のフォルダ名が一致しなかったので、フォルダ名を手作業で変更しました。ポイント
変更前:C:\dev\android-sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows
変更後:C:\dev\android-sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64
CMake Generate
環境構築が済んだので、いよいよ ビルドに向けた準備 に入ります。長い…
設定1
CMake(GUI) を立ち上げて、ソース / ビルドディレクトリ を指定します。
早速 Configure を押しそうになりますが、落ち着いて以下を "+ Add Entry" します。ポイント
(Androidのアーキテクチャが異なる方は armeabi-v7a や x86_64 を指定してください)
Name | Type | Value |
---|---|---|
ANDROID_SDK_ROOT | FILEPATH | C:\dev\android-sdk |
ANDROID_ABI | STRING | arm64-v8a |
追加したら Configure ボタンを押します。
Configure
以下を選択して、Next を押します。
次画面の toolchain では、インストールした NDK 内のファイルを選択します。
(OpenCV内の android.toolchain.cmake は古いっぽい(?)ので使いません)
- C:/dev/android-sdk/ndk/20.0.5594570/build/cmake/android.toolchain.cmake
設定2
Configure が完了したら、以下を追加で "+ Add Entry" して、再度 Configure を行います。
この辺りの設定はご自身の環境に合わせて ちょちょい と変えると良いと思います。
静的ライブラリを作成される方は、BUILD_SHARED_LIBS = OFF, BUILD_FAT_JAVA_LIB = ON (多分デフォルト設定)にして下さい。
Name | Type | Value(参考) |
---|---|---|
ANDROID_NATIVE_API_LEVEL | STRING | 26 |
ANDROID_STL | STRING | c++_shared |
BUILD_PERF_TESTS | BOOL | OFF |
BUILD_TESTS | BOOL | OFF |
BUILD_ANDROID_EXAMPLES | BOOL | OFF |
BUILD_SHARED_LIBS | BOOL | ON |
BUILD_FAT_JAVA_LIB | BOOL | OFF |
Configure 完了後に、各設定の赤文字がなくなっていると思いますので Generate しましょう。
OpenCV ビルド
ついにビルドします!
コンソールで buildフォルダを開いて make を実行します。
私はこの make でエラーが出て 右往左往 しました…
$ cd C:\dev\opencv\opencv-4.2.0_build
$ mingw32-make.exe
~~~ build ~~~
$ mingw32-make.exe install
OpenCVのビルド作業は以上です。
C:\dev\opencv\opencv-4.2.0_build\include に 共有ライブラリ (*.so) が格納されてるはずです。
Xamarinからのライブラリ利用
こちらの記事と同じ手順で確認しました。
実機:Google Pixel 3 (Android 10.0 - API 29)
Xamarin.Forms(Android) から OpenCV(C/C++) を利用する
参考
How to Build OpenCV 4.X for Native Android Development
Error compiling opencv for android #15457
Generate custom opencv .so for Android [Windows 10]
終わりに
冬休み中に完了できず足が出てしましましたのですが、何とか投稿まで進ることができ、年始に悔いを残さずに済みました。
Xamarin は 今 C# でホットな Blazor / Unity / .NET Core / UNO 等と比べて、傍から見ていて 少し熱が冷めた?落ち着いてきた? 印象を受けますが、まだまだ魅力のある環境だと思っています!
少し出遅れましたが、今年はぼちぼち学習していきたいです!