0

我正在尝试在 android 中运行 javascript,发现 Rhino 和 Duktape 提供了在没有 WebView 的情况下运行的功能。但似乎他们都没有明确的方法将可变数量的键值对作为参数传递给我的 js 函数。这个论点看起来像:

{"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";
    }
}

有什么解决方法吗?

4

2 回答 2

1

如果输入是您从程序的其他地方获得的 JSON 编码字符串,您可以将其转换为已解析的对象,如下所示:

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

解码后的值将留在值堆栈顶部。解码调用不是“受保护的”,所以它会抛出无效的输入——如果这很重要,你应该包装整个参数解析并调用例如duk_safe_call()。

这比执行 a 更快(更安全),duk_eval_string()尤其是在输入不完全受信任的情况下。

于 2016-11-23T00:00:17.337 回答
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 中?

于 2016-06-29T10:10:00.020 回答