2012年5月17日木曜日

Android2.3のエミュレータではWebView#addJavaScriptInterfaceが使えない

Android2.3のエミュレータのバグにより,WebViewのaddJavaScriptInterfaceを使用してJavaScriptからJavaのメソッドを呼び出すとアプリが落ちます.
この問題は2.3のエミュレータでのみ発生するようです.

再現するソースコードです.
Java

package se.naru.android.usejavascriptinterface;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.Toast;

public class UseJavaScriptInterfaceActivity extends Activity {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final WebView webView = new WebView(this);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(this, "android");
        webView.loadUrl("file:///android_asset/index.html");
        setContentView(webView);
    }

    public void click() {
        Toast.makeText(this, "Clicked", Toast.LENGTH_LONG).show();
    }
}

assets/index.html

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
  <button onclick="android.click()">Click!</button>
</body>
</html>

Android2.2のエミュレータでは問題なく動作します.

Android2.3のエミュレータで実行するとこのようなログとともにアプリが落ちます.
W/dalvikvm(  446): JNI WARNING: jarray 0x40544ad8 points to non-array object (Ljava/lang/String;)
I/dalvikvm(  446): "WebViewCoreThread" prio=5 tid=9 NATIVE
I/dalvikvm(  446):   | group="main" sCount=0 dsCount=0 obj=0x4051b750 self=0x2986a0
I/dalvikvm(  446):   | sysTid=455 nice=0 sched=0/0 cgrp=default handle=2732232
I/dalvikvm(  446):   | schedstat=( 300585709 627657555 87 )
I/dalvikvm(  446):   at android.webkit.WebViewCore.nativeTouchUp(Native Method)
I/dalvikvm(  446):   at android.webkit.WebViewCore.nativeTouchUp(Native Method)
I/dalvikvm(  446):   at android.webkit.WebViewCore.access$3300(WebViewCore.java:53)
I/dalvikvm(  446):   at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:1158)
I/dalvikvm(  446):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm(  446):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm(  446):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:629)
I/dalvikvm(  446):   at java.lang.Thread.run(Thread.java:1019)
I/dalvikvm(  446):
E/dalvikvm(  446): VM aborting
I/DEBUG   (   30): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   30): Build fingerprint: 'generic/sdk/generic:2.3.3/GRI34/101070:eng/test-keys'
I/DEBUG   (   30): pid: 446, tid: 455  >>> se.naru.android.usejavascriptinterface <<<
I/DEBUG   (   30): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
I/DEBUG   (   30):  r0 fffffec4  r1 deadd00d  r2 00000026  r3 00000000
I/DEBUG   (   30):  r4 800a45c0  r5 40544ad8  r6 80085acc  r7 0029b9c0
I/DEBUG   (   30):  r8 44012b54  r9 43eb0e4c  10 43eb0e34  fp 41edd8a0
I/DEBUG   (   30):  ip 800a4720  sp 44012348  lr afd19375  pc 80045a4a  cpsr 20000030
I/DEBUG   (   30):          #00  pc 00045a4a  /system/lib/libdvm.so
I/DEBUG   (   30):          #01  pc 00037748  /system/lib/libdvm.so
I/DEBUG   (   30):          #02  pc 00039a10  /system/lib/libdvm.so
I/DEBUG   (   30):          #03  pc 0003a4ec  /system/lib/libdvm.so
I/DEBUG   (   30):          #04  pc 002989d6  /system/lib/libwebcore.so
I/DEBUG   (   30):          #05  pc 002120a4  /system/lib/libwebcore.so
I/DEBUG   (   30):          #06  pc 00113216  /system/lib/libwebcore.so
I/DEBUG   (   30):          #07  pc 00212b70  /system/lib/libwebcore.so
I/DEBUG   (   30):          #08  pc 002c716e  /system/lib/libwebcore.so
I/DEBUG   (   30):          #09  pc 002ca4c6  /system/lib/libwebcore.so
I/DEBUG   (   30):          #10  pc 002d83b0  /system/lib/libwebcore.so
I/DEBUG   (   30):          #11  pc 002cfae8  /system/lib/libwebcore.so
I/DEBUG   (   30):          #12  pc 0020ce24  /system/lib/libwebcore.so
I/DEBUG   (   30):          #13  pc 001a0966  /system/lib/libwebcore.so
I/DEBUG   (   30):          #14  pc 001a6ef4  /system/lib/libwebcore.so
I/DEBUG   (   30):          #15  pc 001a4cd4  /system/lib/libwebcore.so
I/DEBUG   (   30):          #16  pc 001a4e1a  /system/lib/libwebcore.so
I/DEBUG   (   30):          #17  pc 001a80a2  /system/lib/libwebcore.so
I/DEBUG   (   30):          #18  pc 001a8236  /system/lib/libwebcore.so
I/DEBUG   (   30):          #19  pc 00065108  /system/lib/libwebcore.so
I/DEBUG   (   30):          #20  pc 00065cae  /system/lib/libwebcore.so
I/DEBUG   (   30):          #21  pc 001254e2  /system/lib/libwebcore.so
I/DEBUG   (   30):          #22  pc 001255da  /system/lib/libwebcore.so
I/DEBUG   (   30):          #23  pc 00125600  /system/lib/libwebcore.so
I/DEBUG   (   30):          #24  pc 00017d74  /system/lib/libdvm.so
I/DEBUG   (   30):
I/DEBUG   (   30): code around pc:
I/DEBUG   (   30): 80045a28 447a4479 ed0cf7d1 20004c09 ee34f7d1
I/DEBUG   (   30): 80045a38 447c4808 6bdb5823 d0002b00 49064798
I/DEBUG   (   30): 80045a48 700a2226 eea0f7d1 000436b7 00045275
I/DEBUG   (   30): 80045a58 0005eb82 fffffec4 deadd00d b510b40e
I/DEBUG   (   30): 80045a68 4c0a4b09 447bb083 aa05591b 6b5bca02
I/DEBUG   (   30):
I/DEBUG   (   30): code around lr:
I/DEBUG   (   30): afd19354 b0834a0d 589c447b 26009001 686768a5
I/DEBUG   (   30): afd19364 220ce008 2b005eab 1c28d003 47889901
I/DEBUG   (   30): afd19374 35544306 d5f43f01 2c006824 b003d1ee
I/DEBUG   (   30): afd19384 bdf01c30 000281a8 ffffff88 1c0fb5f0
I/DEBUG   (   30): afd19394 43551c3d a904b087 1c16ac01 604d9004
I/DEBUG   (   30):
I/DEBUG   (   30): stack:
I/DEBUG   (   30):     44012308  00000015
I/DEBUG   (   30):     4401230c  afd18407  /system/lib/libc.so
I/DEBUG   (   30):     44012310  afd4270c  /system/lib/libc.so
I/DEBUG   (   30):     44012314  afd426b8  /system/lib/libc.so
I/DEBUG   (   30):     44012318  00000000
I/DEBUG   (   30):     4401231c  afd19375  /system/lib/libc.so
I/DEBUG   (   30):     44012320  002986a0  [heap]
I/DEBUG   (   30):     44012324  afd183d9  /system/lib/libc.so
I/DEBUG   (   30):     44012328  0029b9c0  [heap]
I/DEBUG   (   30):     4401232c  0005eb82  [heap]
I/DEBUG   (   30):     44012330  40544ad8  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (   30):     44012334  80085acc  /system/lib/libdvm.so
I/DEBUG   (   30):     44012338  0029b9c0  [heap]
I/DEBUG   (   30):     4401233c  afd18437  /system/lib/libc.so
I/DEBUG   (   30):     44012340  df002777
I/DEBUG   (   30):     44012344  e3a070ad
I/DEBUG   (   30): #00 44012348  00000001
I/DEBUG   (   30):     4401234c  8003774d  /system/lib/libdvm.so
I/DEBUG   (   30): #01 44012350  00000001
I/DEBUG   (   30):     44012354  80039a15  /system/lib/libdvm.so
D/Zygote  (   32): Process 446 terminated by signal (11)
I/ActivityManager(   74): Process se.naru.android.usejavascriptinterface (pid 446) has died.
E/InputDispatcher(   74): channel '406cf340 se.naru.android.usejavascriptinterface/se.naru.android.usejavascriptinterface.UseJavaScriptInterfaceActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
E/InputDispatcher(   74): channel '406cf340 se.naru.android.usejavascriptinterface/se.naru.android.usejavascriptinterface.UseJavaScriptInterfaceActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
I/WindowManager(   74): WIN DEATH: Window{406cf340 se.naru.android.usejavascriptinterface/se.naru.android.usejavascriptinterface.UseJavaScriptInterfaceActivity paused=false}
W/InputManagerService(   74): Got RemoteException sending setActive(false) notification to pid 446 uid 10034

0 件のコメント:

コメントを投稿