NimライブラリをReact Nativeから使いたい(調査編)
こんばんは、昨日作ったリバーシライブラリをiOSアプリに埋め込みたくて、色々調べていました。
でも、まだちゃんと整理しきれていないので、間違っていたら指摘してください!
やりたい事
まず、やりたい事ですが、以下の図の通りです。
iOSアプリ(React Native)から、Nimで作ったリバーシライブラリを呼び出したいと思っています。 Nimを採用した理由は、単純に高速に動きそうだと思ったからです。
でも、その為には自分の知識が足りていなかったので、今日は基本的な調査をしていました。 とりあえず、今回はiOSを中心に調べました。
iOS上で外部ライブラリを使うために
これについては、結論だけ言いますが、プロジェクトに静的ライブラリ(.a)をインポートすれば良いようです。
静的ライブラリとは、複数のオブジェクトファイル(.o)をアーカイブしてまとめたもので、 更にオブジェクトファイルとは、機械語命令とデータが記述されたファイルらしいです。
また、機械語はハードウェアを制御する命令のことで、この命令セットは実際に動かすデバイスのアーキテクチャによって違ってくるようです。 つまり、オブジェクトファイルはアーキテクチャに依存したファイルってことですね。
因みに、オブジェクトファイルに対して、「どのアーキテクチャに対応しているか」はfile {オブジェクトファイル名}
コマンドで分かります。
この例だと、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、i386、x86_64のオブジェクトファイルを用意することになるかなと思っています。
App Thinning
余談です。少し脱線するかもですが許してください。
先ほど、あらかじめそれぞれのアーキテクチャに対応したオブジェクトファイルを作り、静的ライブラリにまとめると言いました。
これを図にすると、以下のような感じになります。
これをアプリに組み込むことで、それぞれのデバイス上でこのライブラリが使えるようになる訳ですが、 このライブラリをそのまま配布すると少し無駄が出てきますね。
例えば、arm64ユーザにとってarmv7、armv7s、i386、x86_64用のオブジェクトファイル群は全く要らないですよね。
なので、この無駄を解消する動きがあるみたいですね。詳しくはこちらを参照ください。
キーワードは、Slicingとか、Bitcode辺りです。(疲れたのでまとめるのは今度で...。)
特にBitcodeの話は結構面白かったですよ。画期的です!
Nim言語からクロスコンパイルするには?
Nim言語のクロスコンパイルについては、以下の記事が参考になるかな〜と思います!
最後に
今日は、iOSデバイス上でNimライブラリを呼び出すためにはどうしたら良いか調査していました。
まだまとめきれてない感ありますが、明日は手を動かしつつやっていきたいと思います。
ではおやすみなさいzzz