[关闭]
@linux1s1s 2016-12-15T03:37:12.000000Z 字数 2456 阅读 1842

Rhino-JavaScript Enginer

JavaScript 2016-12


概述

对于hybird app经常会遇到Java-JS交互的场景,所以这里有必要梳理一下该种场景技术层面如何实现。

目前的实现方案大概有两种,分别是基于WebView控件和Rhino\Nashorn引擎,思路大概如下图所示:

此处输入图片的描述

WebView控件

通过WebView控件可以实现Java-JS交互,具体实现简述如下:

Java与JS通信

只需要通过以下代码即可实现

  1. String jsStr = "javascript:(function(){callname(parameter)})()"
  2. webView.loadUrl(jsStr);

需要注意的地方是parameter需要做转义处理,部分需要转义是字符如下

  1. public static String escapeString(String str){
  2. if(TextUtils.isEmpty(str)){
  3. return "";
  4. }
  5. char[] chars = str.toCharArray();
  6. StringBuilder builder = new StringBuilder();
  7. for(char c : chars){
  8. switch(c){
  9. case '\b' :
  10. builder.append("\\b");
  11. break;
  12. case '\t' :
  13. builder.append("\\t");
  14. break;
  15. case '\n' :
  16. builder.append("\\n");
  17. break;
  18. case '\f' :
  19. builder.append("\\f");
  20. break;
  21. case '\r' :
  22. builder.append("\\r");
  23. break;
  24. case '\\' :
  25. builder.append("\\\\");
  26. break;
  27. case '\'':
  28. builder.append("\\\'");
  29. break;
  30. case '\"':
  31. builder.append("\\\"");
  32. break;
  33. default:
  34. builder.append(c);
  35. }
  36. }
  37. return builder.toString();
  38. }

JS与Java通信

JS与Java通信有两种方式,分别是webView本身提供的注册接口以及通过Http Scheme

注册接口
  1. WebSettings webSettings = webView.getSettings();
  2. webSettings.setJavaScriptEnabled(true);
  3. @Override
  4. public void addJavascriptInterface(WebView webview) {
  5. webview.addJavascriptInterface(new TestJavaScriptInterface(), "name");
  6. }
  7. final public class TestJavaScriptInterface {
  8. public TestJavaScriptInterface() {
  9. }
  10. @JavascriptInterface
  11. public void xxxx(String str) {
  12. //TODO
  13. }
  14. }
Http Scheme

这种方式是间接的通信方法,通常H5和Native约定scheme,H5发起该schme,Native通过拦截该scheme,然后Native再做约定的处理,从而实现JS和Java通信。

  1. <div class="container" style="margin: 50px; padding: 20px;">
  2. <button type="button" class="btn btn-danger btn-xs" style="width: 200px; height: 50px;" onclick="testLine();">测试协议</button>
  3. </div>
  4. <script>
  5. function testLine() {
  6. alert(1);
  7. location.href = 'xxxx://host/path?parameters...';
  8. }
  9. </script>
  1. @Override
  2. public boolean shouldOverrideUrlLoading(final WebView view, String url) {
  3. Uri uri = Uri.parse(url);
  4. String scheme = uri.getScheme();
  5. if ("xxx".equals(scheme)){
  6. //TODO
  7. }
  8. }

Rhino引擎

Rhino,下载源码解压以后将js.jar文件引入到工程下,接下来我们测试一下Java和JS如何通信。

Java与JS通信

  1. //Java 调用 JS
  2. org.mozilla.javascript.Context context = org.mozilla.javascript.Context.enter();
  3. context.setOptimizationLevel(-1);
  4. Scriptable s = context.initStandardObjects();
  5. String js = "100*200/200";
  6. Object result = context.evaluateString(s,js, null, 0, null);
  7. Log.i("mutex", "JS result is: " + result);

看一下验证结果
此处输入图片的描述

JS与Java通信

本地写JS文件,其中实现Java接口如下:

  1. var jsStr={run:function(){print("\nRunning Now...");}}
  2. var r = new java.lang.Runnable(jsStr);
  3. var t = new java.lang.Thread(r);
  4. t.start();

然后通过console控制台运行shell命令,在运行命令前,请将js.jar放入以下目录

C:\Program Files\Java\jre1.8.0_111\lib\ext

运行结果
此处输入图片的描述

参考博文:
Rhino -- 基于java的javascript实现
深入浅出Rhino:Java与JS互操作
Java 8 Nashorn 引擎

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注