React NativeのAndroid版のJSブリッジはどうやってるの?

本日はおひさしぶりにyidev に参加。
今回も始終和やかな雰囲気で和みました。

その中で@motokiee さんのReact Nativeの発表を受け、React NativeのAndroid版はどうやってJSとブリッジしているのだろう?という疑問が私を含む一部で湧いたので、Android詳しいわけでもないのですが、軽く調査。

メモ程度ですが何かのお役に立てば幸い。

com/facebook/react/bridge

ふむ、この辺に色々ありますな。。

react-native/ReactAndroid/src/main/java/com/facebook/react/bridge at 9ee815f6b52e0c2417c04e5a05e1e31df26daed2 · facebook/react-native · GitHub

com/facebook/jni

お、jniがいるということは。。

react-native/ReactAndroid/src/main/java/com/facebook/jni at 9ee815f6b52e0c2417c04e5a05e1e31df26daed2 · facebook/react-native · GitHub

ReactCommon/cxxreact/JSCExecutor.cpp

いましたーそれっぽいc++のクラス。loadApplicationScriptという関数でJSをロードしているっぽいですね。

react-native/JSCExecutor.cpp at 1c249e4804030b5691adf508751c369bf0036f1c · facebook/react-native · GitHub

loadApplicationScript内のJSCreateCompiledSourceCode 関数

JSCreateCompiledSourceCodeという関数が使われており、名前からしてこいつがJSから実行形態に動的にコンパイルしているっぽい。しかしこの関数、ググっても出てこない。jscというモジュールがそれっぽいのだけど。

react-native/JSCExecutor.cpp at 1c249e4804030b5691adf508751c369bf0036f1c · facebook/react-native · GitHub

com/facebook/react/bridge/JavaJSExecutor.java

で、こいつがJSCExecutor.cppにブリッジしている子っぽいです。アプリ側からはこいつを介してJSオブジェクト取ってきたりJSの関数実行したりとかやるわけですね。

react-native/JavaJSExecutor.java at 9ee815f6b52e0c2417c04e5a05e1e31df26daed2 · facebook/react-native · GitHub

ひとまずここまでですー。詳しい方是非とも教えてください!

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の依存関係を解決してくれるらしいです。へー何だそれどうなってんだ。

そういえばお久しぶりの投稿になりました。今後も気が向いた時にゆるく投稿していければと思います。