Android の WebView について調べまくっていますが、Android1.6を考慮にいれると、やれることが少なくて困ることが多いです。基本的な調査は2010/10/27/AndroidのWebViewを極める方法で書いています。

今回調べたのは、JavaScriptからJavaのメソッドを呼んだときの挙動について調査。

基本的に、JavaScriptからJavaを呼ぶには以下のように、addJavascriptInterface() を利用します。

// HogeActivity.java に以下のコードを追加
webview.addJavascriptInterface(javaObject, "_w");

そして、javaObject に以下のメソッドを定義

public void test(Object obj) {
    if (obj == null) {
        log("[test] null");
    } else {
        log("[test]"+obj.toString());
    }
}

JavaScript から呼んでみると・・・

_w.test(function(hoge){alert(hoge);});
_w.test([1,2,3]);
_w.test({a:1,b:2,c:3});
_w.test("test");
_w.test(3);

結果は、全部 null が表示されます。やはり、Java側のメソッドでは型を明示しないとダメみたいです。

public void testInt(int v) {
    log("[testInt]"+v);
}
public void testStr(String v) {
    log("[testStr]"+v);
}

数値と文字列は勝手に変換してくれました。配列は適当な文字列に変換してくれるみたいです。そして無名関数を渡したらその定義文字列が得られました。これは何かに使えるかな?ちょっと面白いかも。

_w.testInt("test"); // 0
_w.testInt(3);      // 3
_w.testInt([1,2,3]);// 0
_w.testStr("test"); // test
_w.testStr(3);      // 3
_w.testStr([1,2,3]);// 1,2,3
_w.testStr(function(hoge){ return hoge; }); // function(hoge){ return hoge; }
_w.testStr({a:1,b:2,c:3});                  // [object Object]

今後のTODO

それで、ここまでやってみて・・・オープンソースなんだから、WebViewのソース見るのが一番早いんじゃないかと思ってみたのですが・・・少し入り組んでいるようなので後で調べる。

たぶん、以下のあたり

https://github.com/OESF/OHA-Android-2.2_r1.1/tree/master/f..