React NativeのAndroid版のJSブリッジはどうやってるの?
本日はおひさしぶりにyidev に参加。
今回も始終和やかな雰囲気で和みました。
その中で@motokiee さんのReact Nativeの発表を受け、React NativeのAndroid版はどうやってJSとブリッジしているのだろう?という疑問が私を含む一部で湧いたので、Android詳しいわけでもないのですが、軽く調査。
Android側のブリッジってどういう仕組みでやってんだろ? #yidev
— ワニ@tmk (@alligator_tama) 2017年2月11日
メモ程度ですが何かのお役に立てば幸い。
com/facebook/react/bridge
ふむ、この辺に色々ありますな。。
com/facebook/jni
お、jniがいるということは。。
ReactCommon/cxxreact/JSCExecutor.cpp
いましたーそれっぽいc++のクラス。loadApplicationScriptという関数でJSをロードしているっぽいですね。
loadApplicationScript内のJSCreateCompiledSourceCode 関数
JSCreateCompiledSourceCodeという関数が使われており、名前からしてこいつがJSから実行形態に動的にコンパイルしているっぽい。しかしこの関数、ググっても出てこない。jscというモジュールがそれっぽいのだけど。
com/facebook/react/bridge/JavaJSExecutor.java
で、こいつがJSCExecutor.cppにブリッジしている子っぽいです。アプリ側からはこいつを介してJSオブジェクト取ってきたりJSの関数実行したりとかやるわけですね。
ひとまずここまでですー。詳しい方是非とも教えてください!
SoLoader (別のライブラリ)
ちなみにこの記事の話題とは直接関係ないですが、jni層(.so)のロードにはfacebook/SoLoaderというのが使われているようでした。
GitHub - facebook/SoLoader: Native code loader for Android
READMEを読むと、
SoLoader is a native code loader for Android. It takes care of unpacking your native libraries and recursively loads dependencies on platforms that don't support that out of the box.
と書いてあり、どうやら再帰的に.soの依存関係を解決してくれるらしいです。へー何だそれどうなってんだ。
そういえばお久しぶりの投稿になりました。今後も気が向いた時にゆるく投稿していければと思います。