【Android】不使用WebView来执行Javascript脚本(Rhino)
2014-05-12 11:11
627 查看
动态执行脚本能有效的降低重要功能硬编码带来的问题,尤其是依赖于第三方的应用,可以通过动态脚本+在线参数(例如友盟在线参数)再不更新应用的情况下升级功能。
项目说明:由
项目使用:把
JavaScript (Rhino) on Android
纯java 的javascript引擎:rhino
深入浅出Rhino:Java与JS互操作
Blog from sollyu
正文
准备
项目地址:https://developer.mozilla.org/en-US/docs/Rhino项目说明:由
Mozilla开发,是 JavaScript 一种基于Java的实现。
项目使用:把
js.jar拷贝到
项目工程既可。
代码
主要实现了从Java中执行js中的函数、从js中调用Java中的方法,代码:public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView text1 = (TextView) findViewById(android.R.id.text1); TextView text2 = (TextView) findViewById(android.R.id.text2); text1.setText(runScript(JAVA_CALL_JS_FUNCTION, "Test", new String[] {})); text2.setText(runScript(JS_CALL_JAVA_FUNCTION, "Test", new String[] {})); } /** Java执行js的方法 */ private static final String JAVA_CALL_JS_FUNCTION = "function Test(){ return '农民伯伯 java call js Rhino'; }"; /** js调用Java中的方法 */ private static final String JS_CALL_JAVA_FUNCTION = // "var ScriptAPI = java.lang.Class.forName(\"" + MainActivity.class.getName() + "\", true, javaLoader);" + // "var methodRead = ScriptAPI.getMethod(\"jsCallJava\", [java.lang.String]);" + // "function jsCallJava(url) {return methodRead.invoke(null, url);}" + // "function Test(){ return jsCallJava(); }"; /** * 执行JS * * @param js js代码 * @param functionName js方法名称 * @param functionParams js方法参数 * @return */ public String runScript(String js, String functionName, Object[] functionParams) { Context rhino = Context.enter(); rhino.setOptimizationLevel(-1); try { Scriptable scope = rhino.initStandardObjects(); ScriptableObject.putProperty(scope, "javaContext", Context.javaToJS(MainActivity.this, scope)); ScriptableObject.putProperty(scope, "javaLoader", Context.javaToJS(MainActivity.class.getClassLoader(), scope)); rhino.evaluateString(scope, js, "MainActivity", 1, null); Function function = (Function) scope.get(functionName, scope); Object result = function.call(rhino, scope, scope, functionParams); if (result instanceof String) { return (String) result; } else if (result instanceof NativeJavaObject) { return (String) ((NativeJavaObject) result).getDefaultValue(String.class); } else if (result instanceof NativeObject) { return (String) ((NativeObject) result).getDefaultValue(String.class); } return result.toString();//(String) function.call(rhino, scope, scope, functionParams); } finally { Context.exit(); } } public static String jsCallJava(String url) { return "农民伯伯 js call Java Rhino"; } }
下载
SampleRhino.zip(2013-12-05)相关文章
Embed JavaScript in Android Java Code with RhinoJavaScript (Rhino) on Android
纯java 的javascript引擎:rhino
深入浅出Rhino:Java与JS互操作
其他
注意:混淆的时候js.jar可能混淆不过去,请参照文章4.1的方法。
Blog from sollyu
相关文章推荐
- 【Android】不使用WebView来执行Javascript脚本(Rhino)
- 【Android】不使用WebView来执行Javascript脚本(Rhino)
- 【Android】不使用WebView来执行Javascript脚本(Rhino)
- Android中WebView的使用总结及Java与Javascript的相互调用
- Android WebView中的JavaScript代码使用
- Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞
- Android WebView中的JavaScript代码使用
- 如何设置WebView使得加载网页时能够执行JavaScript脚本中的alert()函数
- Android WebView中的JavaScript代码使用
- Android在使用WebView时,通过Javascript调用JAVA函数
- android--WebView使用addJavascriptInterface在sdk 17的问题解决
- Android WebView使用以及与JavaScript进行交互实例
- Android WebView中使用Java调用JavaScript方法并获取返回值
- Android使用WebView的,响应网页的JavaScript事件
- Android中Webview使用javascript调用事先定义好的Java函数
- Android_Webview的使用/内存优化/远程执行漏洞处理
- Android WebView中的JavaScript代码使用
- Android WebView中的JavaScript代码使用
- Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)
- 使用webView中的javaScript调用Android方法