久々にAndroidだが、アプリではなくNDKだ。
LinuxでMbedTLSを使ったアプリを作ったのだが、それをAndroidで動かしたい。
もちろん、私が作っているので、C言語だ。
理想は、画面だけAndroidのJavaなどで作って、機能的な部分はNDK/JNIで今作っているものを流用したい。
その前に、まずMbedTLSをAndroidでビルドできるのか?というところが課題となっている。
なお、私はNDKはほとんど知識がないという前提だ(実際、ないのだが)。
一番下に移植性のことが書いてあり、Android OSも入っている。
じゃあ、ビルドは簡単かもしれん。
まず、Android Studio v3.1.2でプロジェクトを作る。
Lollipopがデフォルトで出てきたので、そのまま進める。
ただ、C++だけはチェックしておく。
ビルドして動かすと、画面の真ん中に「Hello from C++」とだけ表示される。
C++のnative-lib.cppで文字列を返して、それをJavaで出力させているのだ。
ビルドするソースファイルの指定は、CMakeLists.txtでやっている。
cmakeを使うようだ。
Android.mkなんかは、もう使わなくなったのかな?
NDKやcmakeは、インストールされていなければビルドエラーと一緒にリンクも出てきて、それをクリックするとインストールしてくれる。
進化したものだ。。。
MbedTLSもcppフォルダ内にcloneしておこう。
https://github.com/ARMmbed/mbedtls
cloneしたものを"android"でgrepしたが、ヒットしない。。。
ビルドしやすいようなサポートはやってないということか。
新規でC/C++ファイルをAndroid Studioに作成していくのであれば、既存のCMakeLists.txtにファイル名を記載していけばよいのだろう。
しかし、既存のライブラリを取り込むのであれば、何か簡単な方法があるのではないだろうか?
今回はMbedTLSだけだが、それ以外の既存ライブラリを使いたいことの方が多いだろう。
そのとき、全部のライブラリに関するファイル名を列挙するのも嫌だし、そもそもライブラリを1つにまとめることになってしまうのが嫌だ。
既存のライブラリは、その単位で扱いたいものである。
Android StudioのUIを使って、cmakeなりndk-buildなりでビルドできるようにしたプロジェクトをリンクできるそうだ。
https://developer.android.com/studio/projects/add-native-code?hl=JA#link-gradle
ライブラリごとにビルドするスクリプトなどを用意しておけば、それぞれプロジェクトをリンクさせるだけでよい、ということではなかろうか?
Android StudioのAndroidビューから、appなどでコンテキストメニューを表示させると「Link C++ Project with Gradle」という項目が出てきそうなことが書いてあるのだが、メニューにはない。
既にC++が使えるプロジェクトにしているから、出てこないのだろうか?
build.gradleにcmakeの項目があったので、pathをもう1つ追加してみたが、ビルドエラーになった。
なんとなく、1つしか書けないような気がする。
他のCMakeLists.txtを取り込むのは、こちらか?
https://developer.android.com/studio/projects/configure-cmake#include-other-cmake-projects
まねをしようとしたが、何をしたらまねになるのかが分からん。。。
こちらが、複数のライブラリを扱った場合のサンプルのようだ。
https://github.com/googlesamples/android-ndk/tree/master/hello-libs
pre-builtと書いてあるので、既にビルドされたライブラリを取り込むのかと思ったが、ソースファイルもあるな。
どっちを使っているのだろう?
- hello-libs: app/src/main/cpp/CMakeLists.txt + ソースファイル
- gen-libs: gen-libs/src/main/cpp/CMakeLists.txt
- lib_gmath: gen-libs/src/main/cpp/gmath/CMakeLists.txt + ソースファイル(static)
- lib_gpref: gen-libs/src/main/cpp/gpref/CMakeLists.txt + ソースファイル(shared)
- log: NDK付属
プロジェクトを開くと、こういう風に見える。
組み込むライブラリのソースファイルは見えない。
distributionディレクトリを削除してリビルドしたら、やはりビルドに失敗した。
READMEにも書かれているが、ビルドしたものをdistributionにコピーしているようだ。
もし再生成したいなら、setting.gradle, app/build.gradleを変更すれば良いそうだ。
setting.gradle
include ':app' // To generate libs used in this sample: // 1) enable the gen-libs at end of this file // 2) enable module build dependency in app/build.gradle // 3) build the app's APK in Android Studio or on command line // 4) undo step 1) and 2) above // include ':gen-libs'
app/build.gradleは、一番最後がコメントアウトされていたから、それか?
tasks.whenTaskAdded { task -> if (task.name == 'externalNativeBuildRelease') { task.dependsOn ":gen-libs:externalNativeBuildRelease" } else if (task.name == 'externalNativeBuildDebug') { task.dependsOn ":gen-libs:externalNativeBuildDebug" } }
両方を有効にしてビルドし直すと・・・おお、distributionディレクトリが復活している。
次は、これを理解するところから始めよう。
先は長いな・・・。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。