📑

[Android] JavascriptInterface の引数に渡された undefined はどう扱われる?

に公開

はじめに

Android 側:

class MyInterface {
    @JavascriptInterface
    fun greet(name: String?) { ... }
}

JavaScript 側:

myInterface.greet(undefined);

このような場合、Android 側の name: String? にはどのような値が渡るでしょうか?

結論

引数が、

  • Java の byte, char, short, int, long, float, double に相当する型の場合: 0
  • Java の boolean に相当する型の場合: false
  • それ以外の場合: null

が渡ります。

上の例の場合、null が渡ります。

詳細

Android WebView の document に、WebView#addJavascriptInterface()@JavascriptInterface に関する仕様の記載があります: https://chromium.googlesource.com/chromium/src/+/master/android_webview/docs/java-bridge.md

ここを読むと、

Argument and return values conversions are handled after Sun Live Connect 2 spec.

という記載があります。

Sun Live Connect 2 spec を読んでみると、2.3.7 Null and Undefined Values というセクションに、JavaScript から引数として渡された nullundefined がどのように変換されるのかについての仕様が定義されています: https://www.oracle.com/java/technologies/javase/liveconnect-docs.html#:~:text=String-,2.3.7 Null and Undefined Values,-When the JavaScript

alt text

結論に記載した通りの仕様が記載されていることが分かります。
また、内容から Android 側では nullundefined を同一視することが分かります。

Discussion