@linux1s1s
2016-12-15T03:37:12.000000Z
字数 2456
阅读 2418
JavaScript 2016-12
对于hybird app经常会遇到Java-JS交互的场景,所以这里有必要梳理一下该种场景技术层面如何实现。
目前的实现方案大概有两种,分别是基于WebView控件和Rhino\Nashorn引擎,思路大概如下图所示:

通过WebView控件可以实现Java-JS交互,具体实现简述如下:
只需要通过以下代码即可实现
String jsStr = "javascript:(function(){callname(parameter)})()"webView.loadUrl(jsStr);
需要注意的地方是parameter需要做转义处理,部分需要转义是字符如下
public static String escapeString(String str){if(TextUtils.isEmpty(str)){return "";}char[] chars = str.toCharArray();StringBuilder builder = new StringBuilder();for(char c : chars){switch(c){case '\b' :builder.append("\\b");break;case '\t' :builder.append("\\t");break;case '\n' :builder.append("\\n");break;case '\f' :builder.append("\\f");break;case '\r' :builder.append("\\r");break;case '\\' :builder.append("\\\\");break;case '\'':builder.append("\\\'");break;case '\"':builder.append("\\\"");break;default:builder.append(c);}}return builder.toString();}
JS与Java通信有两种方式,分别是webView本身提供的注册接口以及通过Http Scheme
WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true);@Overridepublic void addJavascriptInterface(WebView webview) {webview.addJavascriptInterface(new TestJavaScriptInterface(), "name");}final public class TestJavaScriptInterface {public TestJavaScriptInterface() {}@JavascriptInterfacepublic void xxxx(String str) {//TODO}}
这种方式是间接的通信方法,通常H5和Native约定scheme,H5发起该schme,Native通过拦截该scheme,然后Native再做约定的处理,从而实现JS和Java通信。
<div class="container" style="margin: 50px; padding: 20px;"><button type="button" class="btn btn-danger btn-xs" style="width: 200px; height: 50px;" onclick="testLine();">测试协议</button></div><script>function testLine() {alert(1);location.href = 'xxxx://host/path?parameters...';}</script>
@Overridepublic boolean shouldOverrideUrlLoading(final WebView view, String url) {Uri uri = Uri.parse(url);String scheme = uri.getScheme();if ("xxx".equals(scheme)){//TODO}}
Rhino,下载源码解压以后将js.jar文件引入到工程下,接下来我们测试一下Java和JS如何通信。
//Java 调用 JSorg.mozilla.javascript.Context context = org.mozilla.javascript.Context.enter();context.setOptimizationLevel(-1);Scriptable s = context.initStandardObjects();String js = "100*200/200";Object result = context.evaluateString(s,js, null, 0, null);Log.i("mutex", "JS result is: " + result);
看一下验证结果

本地写JS文件,其中实现Java接口如下:
var jsStr={run:function(){print("\nRunning Now...");}}var r = new java.lang.Runnable(jsStr);var t = new java.lang.Thread(r);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 引擎
