2016-06-24 5 views
0

私はアンドロイドでjavascriptを実行しようとしていて、RhinoとDuktapeがWebViewなしで実行する機能を提供しています。 しかし、私のjs関数に引数として可変数のキーと値のペアを渡す明確な方法はないようです。いずれかの回避策はありアンドロイドでjavascriptを実行し、引数としてマップに渡す方法

{"device":"android", "version":"4.4", "country":"US",...} 

とJS側が

function calculate(param) { 
    var country = 'country'; 
    var device = 'device'; 

    if (country in param && param[country]=='US') { 
        return "a"; 
    }; 
    if (device in param && param[device]=="android") { 
        return "b"; 
    } else { 
        return "c"; 
    } 
} 

次のようになります。 引数は、ように見えるのでしょうか?

答えて

1

私はこれを試して、私は期待どおりの結果を得る:

#include "src/duktape.h" 

char code[] = "function calculate(param) {" 
"    var country = 'country';" 
"    var device = 'device';" 
"    if (country in param && param[country]=='US') {" 
"        return \"a\";" 
"    }; " 
"    if (device in param && param[device]==\"android\") {" 
"        return \"b\";" 
"    } else {" 
"        return \"c\";" 
"    }" 
"}" 
"calculate({\"device\":\"android\", \"version\":\"4.4\", \"country\":\"US\"});"; 

int main(int argc, char *argv[]) { 
    duk_context *ctx = duk_create_heap_default(); 
    duk_eval_string(ctx, code); 
    printf("result is: %s\n", duk_get_string(ctx, -1)); 
    duk_destroy_heap(ctx); 
    return 0; 
} 

コンパイルをし、実行します。

$ gcc duktest.c duktape.c -lm 
$ ./a.out 
result is: a 

たぶん、あなたの問題はduktapeではないでしょうか?

+0

あのように、呼び出したメソッドとparamsを直接評価文字列に入れます。それはスマートですが、同じメソッドで複数回実行する場合はパフォーマンス上の問題はありません。 –

+0

@arthur li:元の問題に近づいていると思います。 param引数をオブジェクトではなくJSON文字列として渡そうとした可能性はありますか? – flyingfridge

1

入力は、あなたが他の場所で、あなたのプログラムの中から取得するJSONエンコードされた文字列である場合は、単に解析されたオブジェクトに変換することができます:デコードされた値が値スタックの一番上に残されます

duk_push_string(ctx, my_json_argument); 
duk_json_decode(ctx, -1); 

。デコードの呼び出しは "保護されていない"ので、無効な入力が投げられます。問題がある場合は、引数の解析全体をラップして、たとえばduk_safe_call()に追加します。

特に、入力が完全に信頼されていない場合は、duk_eval_string()を実行するよりも速く(安全です)。

関連する問題