js v8 Android,javascript-Android在没有WebVi的情况下利用V8

我正在练习从Java执行javascript。 Rhino在桌上型电脑上可以很好地解决这个问题,但是必须退回到Android上的(慢速)解释模式(由于dalvik无法执行Rhino JIT编译的Java字节码)。

Android拥有内置的V8 javascript引擎,可通过JNI在内部对其进行访问,并且应提供比Rhino更好的性能; 但是,我只能通过WebView间接访问它。

不幸的是,WebView需要一个Context,并且会在NPE中使用空上下文崩溃,因此我什至无法实例化一个虚拟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,或者至少在不需要实际的WebView的情况下执行javascript,因为运行JavaScript代码似乎是一个笨拙而复杂的方法。

更新

我对代码进行了一些重新排列,尽管这里看不见,但是现在我在AsyncTasks的onPreExecute()上实例化了V8Threads,同时将其他所有内容保留在doInBackground()中。 源代码已在程序的较早部分读取,因此不会为每个线程重复读取该源代码。

因为现在V8Thread是在UI线程上实例化的,所以我可以将其传递给当前视图的Context(我正在使用片段,因此我不能仅将其传递给“ this”),因此它不再崩溃。

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代码从不执行。 我知道线程会完全触发,因为发送了“ Here”日志消息。 这是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、付费专栏及课程。

余额充值