opencvをndk toolchain でc++_static でビルドしたい時の備忘録

## はじめに
cv::FAST などをnative で呼ぶと
Undefined reference 
となってしまうが、それが謎でまだよくわかっていない。
以下はその時に自分でNDKビルドしていないのが理由かと奮闘したときの備忘録である、が、結局まだ解決できていないため、
もし誰か解決策を知っている人がいたら是非ご教授いただきたいです。

ちなみに、手っ取り早く環境を再現したいときは

https://qiita.com/ara_tack/items/d98bce625cb302e3714a
これをフォローするとよい。

##  手順
基本的に、
https://stackoverflow.com/questions/52410712/ndk-problems-after-gnustl-has-been-removed-from-the-ndk-revision-r18/52436751#52436751
これをフォローする。

1. ndk download
2. opencv の　release のダウンロード

上記のバージョンには注意を払う。
その後、opencvの中にて　buildフォルダなどを作る手順はよくやる通りで、
cmake は

```
cmake -DCMAKE_TOOL_CHAIN_FILE=~/Downloads/android-ndk-r18b/build/cmake/android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_STL=c++_static  -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF ..
```

```
cmake -DCMAKE_TOOL_CHAIN_FILE=~/Downloads/android-ndk-r16b/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang "-DANDROID_ABI=arm64-v8a" "-DANDROID_STL=c++_static"  -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF ..
```


without cuda on ubuntu

```
cmake -DCMAKE_TOOL_CHAIN_FILE=~/Downloads/android-ndk-r16b/build/cmake/android.toolchain.make -DANDROID_TOOLCHAIN=clang "-DANDROID_ABI=arm64-v8a" "-DANDROID_STL=c++_static"  -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF -DWITH_CUDA=OFF ..
```

stdlib関連のエラー

```
cmake -DCMAKE_TOOL_CHAIN_FILE=~/Downloads/android-ndk-r16b/build/cmake/android.toolchain.make -DANDROID_TOOLCHAIN=clang "-DANDROID_ABI=arm64-v8a" "-DANDROID_STL=c++_static"  -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF ..
```

を使う。
このとき先ほどインストールしたndkのフォルダへとパスを変更する。

### qt のヘッダーがないと怒られる。

https://stackoverflow.com/questions/39590741/fatal-error-qtkit-qtkit-h-file-not-found-when-i-build-opencv-on-mac

### ffmpg 関連のよくわからないエラー
https://stackoverflow.com/questions/46884682/error-in-building-opencv-with-ffmpeg


## stdlib 関連のエラー


https://ja.stackoverflow.com/questions/59651/stdlib-h%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84


## static が欲しい

`DBUILD_SHARED_LIBS=OFF`
をcmake のフラッグとして追加。


## libopencv_java.so が欲しい

注意点

- cmake オプションを追加
- ubuntu では　`sudo apt-get install ant` を行う
- make ではなく `make install` を行う

参考
https://answers.opencv.org/question/99382/create-libopencv_javaso-from-source/
https://github.com/opencv/opencv/issues/7023

```
cmake -DCMAKE_TOOL_CHAIN_FILE=~/Downloads/android-ndk-r16b/build/cmake/android.toolchain.make -DANDROID_TOOLCHAIN=clang "-DANDROID_ABI=arm64-v8a" "-DANDROID_STL=c++_static"  -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=ON -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_QUICKTIME=OFF -DWITH_GSTREAMER=OFF -DWITH_FFMPEG=OFF -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DBUILD_SHARED_LIBS=OFF -DCOMPONENT=java -DBUILD_FAT_JAVA_LIB=ON ..
```


### JNI のパス
https://stackoverflow.com/questions/17386551/how-to-build-opencv-with-java-under-linux-using-command-linegonna-use-it-in-ma

`sudo vim /usr/share/cmake-3.10/Modules/FindJNI.cmake`
などでJNIへのパスをポイントしようとしたが、うまくいかず、途方に暮れていたところ
https://linuxize.com/post/install-java-on-ubuntu-18-04/
ここにあるように普通に

`sudo apt install default-jdk`

をするととりあえずJNIが認識されていた。。default-jdkの存在は `/usr/lib/jvm` 
で既に確認していたはずでは？？？となったがとりあえず認識されたのでよしとする。


## java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

```
externalNativeBuild {
        cmake {
            arguments '-DANDROID_STL=c++_shared', '-DANDROID_TOOLCHAIN=clang'
        }
    }
```

## 感想
あまり深く手をつけたことがなかったのですが、
このへんのクロスコンパイルのところってとてもむずかしいです。。