2011年12月31日土曜日

紅白FLASH合戦に参加しました。

思春期の若者は再生注意だぜ!


【ニコニコ動画】dead incarnation
movie : hmtbsmv
music : retroshadowz
produced by www.psychedesire.org

Exhibit for The Annual Flash Contest heldon New Years Eve in 2011
http://flash-rw.com/

http://psychedesire.blogspot.com

This Movie was Made by MMD and Other Tools.
Thanks to PMD Modelers,3DS Modelers.


というわけで、紅白FLASH合戦に参加しました。
動画イヴェント自体は、エイヤッサというイヴェントが最後かな?2005年?
http://eiyassa.net/05/
これ以来ですねー。

MMD使ったのがちょっとアレだったーっていう声があったので、
反省したりもしてるんですけど、アニメが簡単に作れるので、
使わないのがもったいないなーと思いますよ。うむ。
もっとFLASHと絡めていきたかったけど、
なかなか難しいなーという感じでした。
踊ってる初音ミクの横を矢印が走る動画なんて、
今更目新しくもないんだろうしねぇ。
もっと、ストーリもあって、音楽もあって、みたいなのが作りたいですねー。
MMDだとアニメ作るの簡単だからねー。面白い面白い。
紅白もMMDおっけーになったみたいだし、
もっとみんなやればいいですよ。ええ。難しいけどね。

2011年12月30日金曜日

紅白FLASH合戦2011に参加します。

あー。というわけで、紅白FLASH合戦に参加致します。

公式サイトは

http://flash-rw.com/

です。
公式サイトに載っている情報を書き換えたら、
このブログのアクセス数がなんと3倍になりました!
20が60になりました!やったね!
何にも載ってないのにね!ごめんね!来た人たち!

私めの作った動画は、
31日の5回戦目(最後の対戦)の赤組となります。

http://flash-rw.com/timetable.php

一番下の、なんだろうくんというやつです。
最初名前どうしようか迷ってたから、適当に名前入れたらそのままになっちゃったよー。
まぁいいんだけどね。

そんな感じでした。
発表をお楽しみにお待ちくださいませませ。

あ、関連リンク集です。

[公式掲示板]■ 紅白FLASH合戦2011 議論スレッド
http://flash-rw.com/bbs/test/read.cgi/rw2011/1312734441/l50


[Twitterハッシュタグ]
http://twitter.com/#!/search?q=%23flashRW

[ニコニコミュニティ]2011年 紅白FLASH合戦
http://com.nicovideo.jp/community/co5520

Enjoy !! :-)


2011年12月26日月曜日

Titaniumで作ったAndroidアプリがデベロッパーコンソールでバージョンアップ出来ない

というわけで、アプリのバージョンアップをしたのですが、
ここでも躓きました。
直したアプリをアップロードしようとしたら、

“The new apk’s versionCode (1) already exists.”

というエラーが出たわけです。

なんでやっ!と思って調べてみたら、


 TitaniumでAndroidアプリのバージョンアップ
 http://www.sawadaru.com/blog/?p=220

こうやって直せば良いわけです。
上のサイトのリンクからたどると書いてありますが、
Titaniumプロジェクト直下(/Resources とか tiapp.xml と同じディレクトリ)に
platform というディレクトリを作り、
更にその中に android というディレクトリを作り、
その中に、
/build/android/AndroidManifest.xml
をコピーしていれて、
その
AndroidManifest.xml
の最初ら辺にある、


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.www.testApp"
android:versionCode=" ここをインクリメント 1 になってたら 2 にする"
android:versionName="バージョン番号 1.0 だったら、1.0.1 とか 1.1 とか">

こんな感じで書き換えます。

以上!勉強になりました。忘れないようにメモ。

忘れないように!と言えば、

PHP で $json = json_decode($jsonStr);
したら、
{"hoge":"huga"}

print($json["hoge"]);
じゃなくて
print($json->{'hoge'}); // huga

これです!連想配列じゃないよ!
忘れるな!俺!


[versionup]Beholdr 1.0.1

Android用ソーシャルフィードリーダ Beholdr のバージョンアップをしました。

一部RSS・2ちゃんねるの購読時に不具合があったことの修正です。




あと、RSSがきちんと取得できていなかった部分を直しました。

Androidマーケットでアプリを公開しました。

 というわけで、取りあえず、公開しちゃいましょうということで、
公開してみました。

いきなりハードルをあげて、300円という値段をつけています。
いいね。勇気があるね。気持ちが違うね。うん。

https://market.android.com/details?id=org.psychedesire.www.beholdr

market://search?q=pname:org.psychedesire.www.beholdr

Beholdrというアプリケーションです。
ソーシャルフィードリーダというカテゴリを名乗ってみました。
どういうアプリかというと、
Twitter/Facebook/Tumblr/FriendFeed/Identi.ca/Flickr/Last.fm/Wassr/はてなハイク/LifeSpaceTime
の更新情報が、ひとつのタイムラインに流れてくるというものです。
また、GoogleReaderの購読リストを取り込んで、その内容を表示することも出来ます。
あと、2ちゃんねるのスレッドを購読することで、2ちゃんねるのスレッドの書き込みも表示できます。

なかなか、大変な思いをしましたが、
出来上がったので満足です。

mixi とか GREE の更新も取得できるようにしたいのだけど、
クレカがなきゃだめだとか、法人じゃなきゃだめだとかで、めんどくさいです。
他に追加して欲しいソーシャルサービスとかあったら教えてください。

いきなり300円だと誰も買わないと思うので、
Twitter と 2ちゃんねると RSSの3種類に限定した、
無料の評価版を作ろうと思います。
まぁ、機能削るだけだから、すぐ出来るとと思います。

あと、購読RSSのところにプリセットするブログとかを探して、
色々メールさせてもらったんだけど、なかなかお返事貰えませんでした。

Androidアプリの情報を取り扱ってるオクトバさんからOKを貰えたので、
プリセット登録させていただいております。
オクトバさん、ありがとうございました!!

2011年12月18日日曜日

Titanium の WebView では AnimationGIFが動かない

な、なんだってー!!

http://developer.appcelerator.com/question/49181/run-animated-gif-image-in-webview-on-andorid

http://developer.appcelerator.com/question/68971/does-imageview-support-gif-file

ということで、

Titanium.UI.ActivityIndicator 使えよってことらしいです。
オブジェクトイヴェントが無駄に増えるお…
APIドキュメントはこちら…

http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.UI.ActivityIndicator-object

Titanium で Facebook連携

Titanium Mobileで作る! iPhone/Androidアプリ 第21回 Facebookとの連携
http://gihyo.jp/dev/serial/01/titanium/0021

大体は、ここに載っているとおりに書いて大丈夫なんだけど…
動かしてみるとエラーになる。

[Titanium Mobile]Facebook と連携するとエラー
http://d.hatena.ne.jp/oreflow/20110517/1305636612

ここにあるように、tiapp.xml を書き換えなきゃならないらしい。
というわけで、書き換えてみる。

んで、適当に技評さんの記事を基にログインしてみるが、

I/Database(  318): sqlite returned: error code = 14, msg = cannot open file at source line 25467

というエラーが発生して動かず。
ログイン関連の情報をSQLiteに保存しようとしてエラーが出ているのかな?
エミュレータだから出ているのかもしれないけど、
あとあと面倒くさそうなので、
自分でFacebook用にOAuth認証をこさえる。

こさえると言えても、以前にJSで動かすものは作っていたので、それを使えば良いだけの話である。
まぁ、SSLを超えられなかったりするから、当時は俺以外の人間に使わせられなかったのだけど、
アプリの中に埋め込むとなると、色々と制約も取れるので、良い感じ。

すげー長いしキモイけど、ザザザっと書いた。


var cid         = [your client id];
var aSec        = [your app secret];
var redirectUrl = [your redirect url]
var authUrl = "";
    authUrl += "http://www.facebook.com/dialog/oauth";
    authUrl += "?client_id=" + cid;
    authUrl += "&redirect_uri=" + redirectUrl;
    authUrl += "&scope=publish_stream";
var faceWin  = Ti.UI.createWindow({title:"faceBook認証"});
var faceView = Ti.UI.createWebView({url:authUrl,scalesPageToFit: true,touchEnabled: true});
faceWin.add(faceView);
faceWin.open({animated:true,fullscreen:true});
var loads = 0;
var cnt = 0;
var inc = 1;
faceView.addEventListener('load',function(e){
    loads++;
    if(loads==cnt){
        var t = setInterval(function(loads){if(loads==cnt + inc){clearInterval(t);return;}},100);
    }else if (loads==cnt + inc) {
        var pincode = faceView.evalJS('window.document.body.innerHTML');
        pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
        if (pincode != "") {
            // my attempt at making sure the stupid webview dies
            faceView.stopLoading();
            faceWin.remove(faceView);
            var tknUrl  = "";
                tknUrl += "https://graph.facebook.com/oauth/access_token?";
                tknUrl += "client_id=" + cid + "&redirect_uri=" + redirectUrl + "&";
                tknUrl += "client_secret=" + aSec + "&code=" + pincode;
            var XHR = Ti.Network.createHTTPClient();
            XHR.onload = function() {
                var res  = XHR.responseText;
                var aTkn = res.replace("acccess_token=",""); // <- こいつを保存
            };
            XHR.onerror = function(e) {
                faceWin.close(); // <- 取得失敗
            }
            XHR.open("GET", tknUrl);
            XHR.send();
            setTimeout(function(){faceWin.close();},3000);
            return true; // we are done here
        }
    }
});
リダイレクトURL のやつは、こんな感じにしとけば、
内容を取得して PIN(じゃなくて、CODEか) を取得できます。
このまま使えば OAuth1.0 と兼用できますよ。
(PHP です。色々ザックリだけど、許して…)
<?php
    $rtkn = $_GET["oauth_token"];
    $pin  = (isset($_GET["oauth_verifier"])) ? $_GET["oauth_verifier"] : "";
    $pin  = (isset($_GET["code"])) ? $_GET["code"] : "";
?>
<!DOCTYPE html>
<html lang='ja'>
    <head>
        <meta charset='UTF-8'>
        <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;">
        <style>
        </style>
    </head>
    <body>
        PIN CODE ...<br>
        <code><?php print($pin); ?></code>
        このウィンドウは自動的に閉じられます。
    </body>
</html>

2011年12月17日土曜日

続・TitaniumのWebViewで変数を渡す

前に、

TitaniumのWebViewで変数を渡す
http://psychedesire.blogspot.com/2011/12/titanium-webview.html

この記事の中で、

var obj = {hoge:"hugahuga"};
var win = Ti.UI.createWindow();
var web = Ti.UI.createWebView({url:"hoge.html"});
win.add(web);
win.addEventListener("open",function(e){
web.evalJS("func(" + JSON.stringify(obj) + ")");
});

こうやって書けば、WebView:web に変数を渡せると書いたけど、
これだと、問題が発生することがわかった。
どんな問題かというと、WebView 内で jQuery とかを読み出していた時に、
jQuery のロードを待たずに変数の代入や関数の実行が行われるのだ。

というわけで、こういう場合は、

var obj = {hoge:"hugahuga"};
var win = Ti.UI.createWindow();
var web = Ti.UI.createWebView({url:"hoge.html"});
win.add(web);
web.addEventListener("load",function(e){
web.evalJS("func(" + JSON.stringify(obj) + ")");
});

このように書けば、WebView:web のロードを待って、
ロードが終わった後に、evalJS が実行される。

2011年12月15日木曜日

見つけたTitanium Tips等。

Titaniumって、案外情報がないので、わからないことがあると、結構検索して周っています。
そんななかで見つけた記事を書いてみます。

Titaniumでネットワーク周りのメモリリークを回避する
http://www.mountposition.co.jp/blog/?p=86

一応やってみました。効果があるのか無いのかは、まだ未確認…

Titanium アプリ初回起動時のRestart Requiredダイアログ対処法
http://www.mountposition.co.jp/blog/?p=295

これ、俺の使ってるAUのINFOBAR A01 でも起こります。
いったいなんなんだろうなーくらいにしか思って無かったです。

ウィンドウを開くたびに初期処理を行う
http://www.mountposition.co.jp/blog/?p=60

単純にウィンドウを開いたときに行う処理は、open でいいんだけど、
例えばメニューウィンドウのように、行ったり来たりを繰り返すときは、
focus を使ったほうが良いと思います。




Android マーケットに登録しました。

まだアプリは完成していないけど、
取りあえず登録だけはしてみました。
諸事情あり、クレジットカードが持てない私ですが(笑)、
V-preca という、まぁ、WAON とか、 NANACO みたいな、チャージして使うカードで、
VISAのカードの番号も持てるやつがあったので、
それを使い、GoogleCheckOutでお金が払えました。

http://vpc.lifecard.co.jp/

Androidマーケットの登録については、

http://www.taosoftware.co.jp/android/market/market_start.html

ここを見たら良いでしょう。

V-preca で、ついでに mixi の個人デヴェロッパ登録(クレカが無いとGraphAPIが使えないのだ!)もしてみたのですが、
こちらはVISAの番号が通らないようです。
V-preca の利用可否については、

http://ja.v-preca.wikia.com/wiki/%E5%88%A9%E7%94%A8%E5%8F%AF%E5%90%A6

ここが詳しいです。

今日は、2ちゃんねるの板情報、スレッド情報、DATの取得等を、
PHPで書いたりしました。

2chのdatをjsonpで返す非公式APIを作ってみた
http://d.hatena.ne.jp/ogatatsu/20090917/1253184608

既にこういう便利なものがあるのですが、
人様の AppEngine のトラフィックを増やすわけにはいかないので、
自前でコツコツ書いていました。
メンドくさかったー。

先日書いた、phpcloud.com で動くようにしてあり、
phpcloud.com 上で 2ch のデータを JSON に変換し、
Android アプリが、そのJSONデータを引っ張ってくるような感じです。
WebView と Titanium 本体のイヴェントのやりとりが、
結構面倒だったり、結構頭がこんがらがってくる感じではありますが、
一気に片付けたので、なんとかなりました。多分。


というか、WebView内でJSONPもらおうとしても、もらってくれない!
というわけで、Titanium 側で生のレスポンステキストをWebViewに送って、
WebView 側でJSON.parse() することに…
なんなんだー!
と思ったら、Titanium でJSONゲット、JSON.parse 、 JSON,stringify したのをWebViewしたら動きました。
死にたい。。。

あ、あと、Google+ のアカウントと、Blogger のアカウントを連動させることが出来る(?)ようになったようなので、
それをやってみました。

あー。あと、欲張って Google+ のAPIも使おうとしたんだけど、
これって Twitter で言う Timeline 的なものは取得できないんですなぁ。
使えないのう。OAuth2.0 だから、BirdHouse 書き換えなきゃならなくなるしなぁ。

2011年12月11日日曜日

続々・Titanium と BirdHouse で TwitterOAuth

まーじーかっ!!
おかげでなぞが解けた。ありがとう。スタックオーヴァフロゥ

んと、BirdHouseをそのまま使うと、
AccessToken取得時に、Accesser に Request_token_secret を入れないようになっている。
これはTwitterには必要ないためだと思う。
なので、
Tumblr や Flickr のOAuthに対応できなくなってしまうので、
利用するサービス名を取得しーの、

function get_access_token(callback) {}
の頭のほうに、
if(cfg.serviceName != "twitter"){accessor.tokenSecret    = cfg.request_token_secret;}
と書けば、万事解決な気持ちがします!

http://stackoverflow.com/questions/8373885/getting-an-oauth-access-token-not-language-specific-same-issue-for-flickr-an



0 down vote accepted
I'll answer my own question.
There were a few discrepancies between the different oauth service provider implementations:
Twitter
  • Expects oauth_callback on request_token step
  • Doesn't return oauth_token_secret until access_token response
  • Therefore, there's an empty oauth_token_secret in signing the access_token request
Flickr & Tumblr
  • Expect oauth_callback on authenticate (i.e. authorize) step
  • Return oauth_token_secret on request_token step (and expect you to remember it and use it to sign access_token request)
Youtube (and other Google OAuth service providers):
  • Expects Google-proprietary "scope" on request_token step
  • Expects oauth_callback on authenticate (i.e. OAuthAuthorizeToken) step
  • Doesn't seem to like oauth_token passed in Authorization header in the access_token step (responds with "token invalid" due to required double-encoding in base string). Pass it in the post body or query string instead.

続・Titanium と BirdHouse で TwitterOAuth

というわけで、BirdHouseを使ってOAuth認証させるにあたり、相当直した。
直したっていうか、直して、エミュレータでは、動いたけど、実機で動くかは、まだ確かめていない。

まず、PINコードがそのままでは取得できないぽい(?)
function get_request_verifier() を色々と直してやった。
まず function checkStatus() は削除。いらね。
if (loads==2) { ~ }

if(loads==1){var t = setInterval(function(loads){if(loads==2){clearInterval(t);return;}},100);}
こうした。
ログを見ていると、loads がインクリメントされるのが、2回なので、こうしないと動かないぽい。
これにともない、 checkStatus() はいらなくなった気がする。
あと、 loading というフラグもいらなくなった気がする。

で、
else if (loads==3) { ~ }
がこうなった。
else if (loads==2) {
    var pincode = webView.evalJS('window.document.body.innerHTML');
    pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
    cfg.request_verifier = pincode;
    if (cfg.request_verifier!="") {
        // my attempt at making sure the stupid webview dies
        webView.stopLoading();
        win.remove(webView);
        get_access_token(callback);
        setTimeout(function(){ //* TODO: check for ios vs android
            win.close(); //* we close it after 3 seconds, which is more than enough time
        }, 3000);
        return true; // we are done here
    }
}

PINを取得する部分は、どうしてもTwitterなどサービス側の仕様変更などに、
粒さに対応し、手を加えなくてはいけない気もする。
めんどくせーから正規表現でボリボリとむしってみた。
最後のreplace()は完全に蛇足だけど、心配性なの私。

赤字の部分は、
https://github.com/jpurcell/birdhouse/issues/16
ココを元に。
古い端末向けに、Windowが閉じるのを数秒待たないと、

W/MessageQueue( 337): Handler{4059ce70} sending message to a Handler on a dead thread
こう言われて、AccessToken が取得できなくなってしまうぽい。

他は、requestToken 発行用のURLと authorizeURL 、 AccessToken 発行用の URL を init() のパラメタにして、
AccessToken 、AccessTokenSecret の保存先をあれやこれやしてみた。
まぁ、PINコード取得画面がサービス毎に違うだろうから、単純にはいかないだろうけど、
Tumblr と Flickr でも OAuth で認証させたいので、そこらへんもカリカリして、
ホゲホゲしたら、後は動かせるかなぁ~という感じ。
OAuth対応だけで一日かかったよ~。めんどくせ。

2011年12月10日土曜日

Titanium と BirdHouse で TwitterOAuth

色々見て周って、動かしてみたんだけれども、
Twitterだけに関しては、

http://blog.mogya.com/2011/01/oauthiphone10.html

こっちより、

https://github.com/jpurcell/birdhouse

こっちのほうが良い。
なんか、twitter_api.js はエラーが起きる128行目で。
何故かは判らないけど。

で、

http://blog.fkoji.com/2011/06282251.html

ココを見ると、birdhouse はアクセストークンとかの保存が変らしい。
そこのところを直したり、他のOAuthサービスでも使えるようにチョコチョコ直した。
PINコード持ってくるところがいろんなサービスによって違うので、
そこが困ったところである。うむむむむ。

スクリーンショット

こんな感じのを作っています。






WebView のリンクをクリックしたら、別なWebView を開く

WebView上のリンクをクリックすると、
そのWebView上でリンクを開いてしまうようなので、これを何とかしたい。

手順としては、
WebView上のリンクをクリックしたら、
Titanium へリンクがクリックされたというイヴェントと共に、
リンク先URLを送る。
更に、リンククリックを無効化する。

次に、
Titanium側でリンクがクリックされたイヴェントを発火させる。
受け取ったリンクを元に、新しいWindowとWebViewを開く。

まぁ、書いてみると、たいしたことではない。
忘れる前に参考URL
jQueryでリンクを無効にするやり方はコチラ。
http://black-flag.net/jquery/20110526-3128.html

TitaniumのWebViewからリンククリックイヴェントを取得するやり方はコチラ。
http://www.mountposition.co.jp/blog/?p=81

実際に書いてみるとこんな感じ。
【html側】
$(document).ready(function(){
    $("a").live("click",function(e){
        var link     = $(this).attr("href");
        Ti.App.fireEvent("linkClick", {link:link});
        return false;// or e.preventDefault();
    });
});

で、Titanium側は

【Titanium側】
Ti.App.addEventListener("linkClick",function(e){
        var win      = Ti.UI.createWindow();
        var linkView = Ti.UI.createWebView({url:e.link});
        win.add(linkView);
        win.open({animated:true,fullscreen:true});
});

return false;// or e.preventDefault();
で、A要素をクリックしたときのイヴェントを打ち消してる
(現在ののWebView上でURLを開かないようにしている)感じ。
まぁ、あとは参考URLのとおりです。
$("a").live() にしているのは、
動的に要素を追加した時とかに困るから。
jQuery1.7 系からは on/off とかだっけ?忘れた。それとは別か?

まぁ、こんな感じですね~。
あんまり、 $(document).ready(function(){}); の中にコード書きたくないんだけど、まぁ、いいかな。たまには。

WebView内のスクロール制御

WebView内に読み込むHTMLファイルで、

html,body{width:100%}
とかやってみると、
横にビローンって長くなる。なんぞこれ。と色々やってみるも、
うまく動かず。
解決方法は、

http://d.hatena.ne.jp/sDaigo/20101113/1289650584

にあるとおり、

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;" />
としてあげれば良いです。
 
まぁ、はみ出す要素があった場合は、その分スクロールバー出ちゃうんだけど、
たとえば画像とかだと、
<img src='src/hoge.png' style='max-width:80%;height:auto'> 
ってやれば、横幅は親要素の80%で、縦はそれにあわせて勝手に調整してくれるので、
こんな感じでやっておけばよいです。

Noooooooooooo!!

エミュレータで動いて実機で動かないってなんじゃそりゃおーーーい!
おろろろろろ~~~~~~~~~ん!!

2011年12月9日金曜日

Androidではあんまり動的にTableViewRowとか追加したらダメ

だと思います。
動的の使い方が間違っているかもしれないけど。
なんつーの?イヴェントをやったら行がどんどん増えていくとか、そういうのは、
やらんほうがよいっぽい。気がする。

やったら判るけど、重い。処理が。
まぁ、端末にも寄るだろうし、ただ行の中身が文字列とかなら、まだ大丈夫だろうけど、
行の中にImageView追加してみたり、あれやこれや追加してしまうと、
すんごく重い。アプリケーションから反応がありませんが頻発するっぽい。
WebView内に、追加したい行みたいなのを追加していったほうが、サックサクだと思います 。
ていうか、そうしましょう。
むしろ、殆どWebViewでいいんじゃねーかと思う。
Titaniumで開発しているからそうなってるのかなー。たぶん、違うだろうな。

画像を読み込む時と、画像をリサイズするときの処理が重いっぽい。
そこら辺かな。画像はキャッシュしたりとかすればいいんだろうけども。
そこ、もうちょい調べてみようとは思うが、まぁ、調べたところで、WebViewでやっちゃいます。僕は。

2011年12月7日水曜日

TitaniumのWebViewで変数を渡す

【Titanium Mobile】WebViewへ変数を渡す
http://www.johnnnnny.com/blog/?p=82


Titanium の WebView で HTML をホスト
http://akabeko.sakura.ne.jp/blog/2010/11/titanium-%E3%81%AE-webview-%E3%81%A7-html-%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88/


ここらへんを見たんだけど、
要は、Evalするんで、Evalできるようなものじゃないとだめ。
難しいなー。難しくは無いんだけど、なんだろね。
【html側】
var test = function(obj){
$("#dummy").before(obj["val"]);
}

【Androidアプリ側】
var wv = Ti.UI.createWebView({url:"test.html"});
var btn = Ti.UI.createButton({title:"hoge",width:300,height:50});
btn.addEventListener = function(e){
var obj = {val:"hoge"};
var js  = "test(" + obj + ");";
webview.evalJS(js);
}

これで、btnを押したら、WebViewでhogeって文字が出て欲しい。
まぁ、勿論でないのは、わかる。動きません。

なんていうの?そのー、変数の実体を渡したいの。僕は。
でも、それが出来ないということなんだと思う。つまり。
つか、Evalなんだから、当たり前なんだけど。
つまり、オブジェクトを渡したいなら、
JSON化しなきゃならん。つまりそういうことなんだろうなと思う。
配列にせよ、同じなんだろうが。

コンテキストをまたいでデータを参照で共有する方法
http://ti.masuidrive.jp/topic.php?id=221#post-655

ここらへんかな?
まぁ、そういうわけなんで、解決方法としては、

var js = "test(" + obj + ");";

の部分を、

var js = "test(" + JSON.stringify(obj) + ");";

と書いてあげればいいです。
終了