Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-Android- WebViewクラスとJavaの間の通信は難しい、、、

f:id:jurupapa:20130719150857j:plain

ワシントンDCのホテルにて

 

 

ご無沙汰です。

 

Maxima on AndroidMaximaのマニュアルを搭載しています。この中には非常に多くのセッション例が含まれています。例えば微分方程式の章にはこんな例があります。

f:id:jurupapa:20130727221340p:plain

 

これらの例をコピー&ペースとしながらMaximaで実行させたいですよね。そこで、このようなセッション例をタップするとMaximaに戻り、最初の一行目が数式入力エリアに入り、実行出来るようにしました。

更に、メニューの中のNext Exampleというメニューを選ぶと次の入力行が数式入力エリアに入ります。このようにして次々にセッション例を実行出来るようにしました。やってみると楽しいです。

 

この実装、基本形が出来たのは1ヶ月くらい前でした。そこからのデバッグが大変だった、、、。

 

セッション例の文字列をHTMLのDOMから読み出して、javaに渡す必要があります。このために、Javaオブジェクトをjavascriptから呼び出せるようにする

addJavascriptInterface(javaObj, "jsobjname")

という仕組みを使って実装しました。

この仕組みを使うと、javascriptからjsobjnameという変数名でjavaObjのメソッドを呼び出せるのです。確かにこの仕組みでセッションの文字列をjavaに送ることができました。

 

ところが、、、10回に3回くらいの割合でjsobjname変数の値が未定義(undefined)に成ってしまうのです。何が原因か結局のところ分かりませんでした。net上でも同じような事例はあるのですが、root causeやworkaroundは見つかりませんでした。

 

この方法がこの割合でエラーを起こすようではとてもリリース出来ず、昨日から別の通信方式を調べ始めたところでした。

 

灯台下暗し、、、javascriptからconsole.log(msg)でログ出力をすると、そのwebviewに設定したWebChromeClientにonConsoleMessage()というコールバックが呼び出されます。この中で自分でコードを書いてlogcatに出力する、というのが定番処理です。この通信に多重化してセッション例の文字列も送ることにした訳です。

 

やってみると非常に安定して通信出来ることが分かりました。

 

ようやくリリース準備に入れます、、、、