てすと

たかろぐ

自分のログを刻みます。

NimライブラリをReact Nativeから使いたい(調査編)

こんばんは、昨日作ったリバーシライブラリをiOSアプリに埋め込みたくて、色々調べていました。

でも、まだちゃんと整理しきれていないので、間違っていたら指摘してください!

やりたい事

まず、やりたい事ですが、以下の図の通りです。

f:id:g-knk-9410:20180327224106p:plain:w600

iOSアプリ(React Native)から、Nimで作ったリバーシライブラリを呼び出したいと思っています。 Nimを採用した理由は、単純に高速に動きそうだと思ったからです。

でも、その為には自分の知識が足りていなかったので、今日は基本的な調査をしていました。 とりあえず、今回はiOSを中心に調べました。

iOS上で外部ライブラリを使うために

これについては、結論だけ言いますが、プロジェクトに静的ライブラリ(.a)をインポートすれば良いようです。

静的ライブラリとは、複数のオブジェクトファイル(.o)をアーカイブしてまとめたもので、 更にオブジェクトファイルとは、機械語命令とデータが記述されたファイルらしいです。

また、機械語はハードウェアを制御する命令のことで、この命令セットは実際に動かすデバイスアーキテクチャによって違ってくるようです。 つまり、オブジェクトファイルはアーキテクチャに依存したファイルってことですね。

因みに、オブジェクトファイルに対して、「どのアーキテクチャに対応しているか」file {オブジェクトファイル名}コマンドで分かります。 f:id:g-knk-9410:20180328000800p:plain:w400

この例だと、x86_64が命令セットのアーキテクチャに当たる感じですかね。

そして、iOSにもこのアーキテクチャの種類がいくつかあるみたいなので、一応まとめておきます。 (こちらの記事の引用です。)

アーキテクチャ 32 / 64 bit バイス
armv6 32bit iPhone、iPhone3G
armv7 32bit iPhone3GS以降
armv7s 32bit iPhone5以降
arm64 64bit iPhone5s以降
armv7k 32bit Apple Watch
i386 32bit Simulator
x86_64 64bit Simulator

なるなる。 ここまでの話を総合すると、色々な種類のデバイスに対応させたいのなら、あらかじめそれぞれのアーキテクチャに対応した形でオブジェクトファイルを作っておいて、 それらを全部静的ライブラリとしてまとめておきなさいってことになるのかなと解釈しました。

そして、この違うアーキテクチャに対応した形に変換することをロスコンパイルと呼びます。

今回はiPhone、iPhone3G、Apple Watchは対応切っちゃってもいいかなと考えているので、 自分はarmv7、armv7s、arm64、i386x86_64のオブジェクトファイルを用意することになるかなと思っています。

App Thinning

余談です。少し脱線するかもですが許してください。

先ほど、あらかじめそれぞれのアーキテクチャに対応したオブジェクトファイルを作り、静的ライブラリにまとめると言いました。

これを図にすると、以下のような感じになります。

f:id:g-knk-9410:20180328002925p:plain:w400

これをアプリに組み込むことで、それぞれのデバイス上でこのライブラリが使えるようになる訳ですが、 このライブラリをそのまま配布すると少し無駄が出てきますね。

例えば、arm64ユーザにとってarmv7、armv7s、i386x86_64用のオブジェクトファイル群は全く要らないですよね。

なので、この無駄を解消する動きがあるみたいですね。詳しくはこちらを参照ください。

キーワードは、Slicingとか、Bitcode辺りです。(疲れたのでまとめるのは今度で...。)

特にBitcodeの話は結構面白かったですよ。画期的です!

Nim言語からクロスコンパイルするには?

Nim言語のクロスコンパイルについては、以下の記事が参考になるかな〜と思います!

qiita.com

最後に

今日は、iOSバイス上でNimライブラリを呼び出すためにはどうしたら良いか調査していました。

まだまとめきれてない感ありますが、明日は手を動かしつつやっていきたいと思います。

ではおやすみなさいzzz