js v8 Android,javascript – Android利用V8没有WebView

我正在从Java执行javascript。 Rhino在桌面上运行得很好,但是在Android上由于dalvik无法执行Rhino JIT编译的Java字节码,所以必须回到(慢)解释模式。

Android有内置的V8 JavaScript引擎,通过JNI内部访问,应该比Rhino提供更好的性能;然而,我可以找到访问它的唯一方法是间接通过WebView。

不幸的是,WebView需要一个Context,并且与NPE和null上下文崩溃,所以我甚至不能实例化一个虚拟WebView只执行代码并返回结果。我的练习的性质不真的允许我提供WebView的上下文,所以我希望也许有一些我忽略。

其中一些V8Threads并行运行,所以它不是真正可行的(就我所知)添加一个WebView到我的布局和隐藏它,因为我不相信一个WebView可以执行多线程的函数。

private class V8Thread extends Thread

{

private WebView webView;

private String source;

private double pi;

private int i, j;

public V8Thread(int i, int j)

{

pi = 0.0;

this.i = i;

this.j = j;

source = "";

try {

InputStreamReader isReader = new InputStreamReader(assetManager.open("pi.js"));

int blah = isReader.read();

while (blah != -1)

{

source += (char)blah;

blah = isReader.read();

}

webView = new WebView(null);

webView.loadData(source, "text/html", "utf-8");

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(this, "V8Thread");

} catch (IOException e) {

e.printStackTrace();

}

}

public double getResult()

{

return pi;

}

@Override

public void run()

{

webView.loadUrl("javascript:Androidpicalc("+i+","+j+")");

}

}

理想情况下,必须有一些支持的方式直接调用V8,或至少执行javascript,而不需要一个实际的WebView,因为它似乎是一个相当笨重和复杂的方法只是运行JavaScript代码。

更新

我已经重新安排我的代码有点,虽然看不到这里是,现在我实例化V8Threads在AsyncTasks的onPreExecute(),而保持一切在doInBackground()。源代码在程序的前面读取,因此不会为每个线程重复读取。

因为现在的V8Thread实例化在UI线程,我可以传递它当前视图的上下文(我使用的片段,所以我不能只是传递它“这”),所以它不再崩溃。

private class V8Thread extends Thread

{

private WebView webView;

private double pi;

private int i, j;

public V8Thread(int i, int j)

{

pi = 0.0;

this.i = i;

this.j = j;

source = "";

webView = new WebView(v.getContext());

}

@SuppressWarnings("unused")

public void setResult(String in)

{

Log.d("Pi",in);

}

public double getResult()

{

return pi;

}

@Override

public void run()

{

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(this, "V8Thread");

webView.loadData(source, "text/html", "utf-8");

//webView.loadUrl("javascript:Androidpicalc("+i+","+j+")");

webView.loadUrl("javascript:test()");

Log.d("V8Thread","Here");

}

}

但是,当执行时,logcat会在错误“第一个布局后无法获取viewWidth”的每个线程中输出一个,并且JavaScript代码永远不会执行。我知道线程完全火灾,因为“这里”日志消息发送。这里是js代码中相关的test()函数。

function test()

{

V8Thread.setResult("blah");

}

工作正常,“blah”应该在logcat中显示四次,但它永远不会显示。可能是我的源代码读取不正确,但我怀疑。

Scanner scan = new Scanner(assetManager.open("pi.js"));

while (scan.hasNextLine()) source += scan.nextLine();

我唯一可以想象的是,由于这些上述错误,webView从来没有真正地到执行javascript。

我还要补充说,pi.js只包含javascript,没有HTML。然而,即使我把它包装在足够的HTML,它的资格作为一个网页,仍然没有运气。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值