Android中的JavaScript

是否可以在 Android中使用 JavaScript?如果是这样,怎么样?请提供一些例子.

谢谢.

解决方法

在这里参加派对的时间已经很晚了,但我有这个确切的需求. iOS 7现在包含JavaScriptCore
原生,它很容易使用(尽管有限的文档).问题是
我不想使用它,除非我也可以在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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...