解决方法
我在这里参加派对的时间已经很晚了,但我有这个确切的需求. iOS 7现在包含JavaScriptCore
原生,它很容易使用(尽管有限的文档).问题是
我不想使用它,除非我也可以在Android上使用类似的东西.所以我创建了 AndroidJSCore project.它允许您在Android中原生使用JavaScript代码,而不需要庞大的WebView和注入.您还可以无缝地进行异步
Java和Javascript之间的调用.
原生,它很容易使用(尽管有限的文档).问题是
我不想使用它,除非我也可以在Android上使用类似的东西.所以我创建了 AndroidJSCore project.它允许您在Android中原生使用JavaScript代码,而不需要庞大的WebView和注入.您还可以无缝地进行异步
Java和Javascript之间的调用.
更新于3月27日:AndroidJscore已被弃用,赞成LiquidCore.LiquidCore基于V8而不是JavascriptCore,但基本相同.见documentation on using LiquidCore as a raw Javascript engine.
从文档:
…要开始,您需要创建一个JavaScript JSContext.执行JS代码
在此上下文中发生,并且单独的上下文是隔离的虚拟机
不要互相交流.
JSContext context = new JSContext();
该上下文本身就是一个JavaScript对象.因此,您可以获取并设置其属性.
由于这是全局JavaScript对象,因此这些属性将位于顶层
环境中所有后续代码的上下文.
context.property("a",5); JSValue aValue = context.property("a"); double a = aValue.toNumber(); DecimalFormat df = new DecimalFormat(".#"); System.out.println(df.format(a)); // 5.0
您还可以在上下文中运行JavaScript代码:
context.evaluateScript("a = 10"); JSValue newAValue = context.property("a"); System.out.println(df.format(newAValue.toNumber())); // 10.0 String script = "function factorial(x) { var f = 1; for(; x > 1; x--) f *= x; return f; }\n" + "var fact_a = factorial(a);\n"; context.evaluateScript(script); JSValue fact_a = context.property("fact_a"); System.out.println(df.format(fact_a.toNumber())); // 3628800.0
您也可以用Java编写函数,但是将它们公开给JavaScript:
JSFunction factorial = new JSFunction(context,"factorial") { public Integer factorial(Integer x) { int factorial = 1; for (; x > 1; x--) { factorial *= x; } return factorial; } };
这将创建一个JavaScript函数,该函数将在何时调用Java方法factorial
从JavaScript调用.然后可以将其传递给JavaScript VM:
context.property("factorial",factorial); context.evaluateScript("var f = factorial(10);") JSValue f = context.property("f"); System.out.println(df.format(f.toNumber())); // 3628800.0