OpenCV をソースコードからビルドしてXamarin で利用する

## はじめに

本記事は下記の続き（リベンジ）です。

[Xamarin.Forms(Android) から OpenCV(C/C++) を利用する](https://qiita.com/hsytkm/items/73a8057e001dda72b6d2)



前回は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

[ココ](https://cmake.org/) の Latest Release (3.16.2) をインストールしました。



#### MinGW

[ココ](http://www.mingw.org/) のインストーラ (mingw-get-setup.exe) を使い、以下の設定でインストールしました。

![mingw.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249816/f2245639-5914-2d5a-5e83-1ee974af26bc.png)


インストールが完了したら 環境変数 PATH に binフォルダのパスを通しておきます。 **ポイント**

#### 

#### Android SDK / NDK

最後に Android SDK と NDK をインストールするため、[ココ](https://developer.android.com/studio) からAndroid SDK Command line tools を取得します。

（Android Studio をインストールされている方は、そちらからインストールすると良いと思います）



次に SDK / NDK をインストールします。今回は C:\dev\android-sdk\tools に解凍しました。

``` sh
$ cd C:\dev\android-sdk\tools\bin
$ .\sdkmanager.bat --update
$ .\sdkmanager.bat --list          # パッケージの一覧表示
```

表示されたリストを見て SDK / NDK のバージョンを指定します。

今回は（VisualStudio に合わせて）以下のバージョンを選択しました。

``` sh
$ .\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 ボタンを押します。

![cmake1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249816/cdc4c976-2695-4142-baa1-acf62afe7352.png)



#### Configure

以下を選択して、Next を押します。


![cmak2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249816/454ef059-8f44-1f05-6929-acc4d701042b.png)


次画面の 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 でエラーが出て 右往左往 しました…

``` sh
$ 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++) を利用する](https://qiita.com/hsytkm/items/73a8057e001dda72b6d2)



## 参考

[How to Build OpenCV 4.X for Native Android Development](https://amin-ahmadi.com/2019/02/03/how-to-build-opencv-4-x-for-native-android-development/)

[Error compiling opencv for android #15457](https://github.com/opencv/opencv/issues/15457)

[Generate custom opencv .so for Android [Windows 10]](https://answers.opencv.org/question/220270/generate-custom-opencv-so-for-android-windows-10-solved/)



## 終わりに

冬休み中に完了できず足が出てしましましたのですが、何とか投稿まで進ることができ、年始に悔いを残さずに済みました。

Xamarin は 今 C# でホットな Blazor / Unity / .NET Core / UNO 等と比べて、傍から見ていて 少し熱が冷めた？落ち着いてきた？ 印象を受けますが、まだまだ魅力のある環境だと思っています！

少し出遅れましたが、今年はぼちぼち学習していきたいです！