使用Rhino让java执行javascript的方法实例
下载rhino https://developer.mozilla.org/en-us/docs/rhino
把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";
}
}
注意,混淆的时候js.jar可能混淆不过去,请参照文章4.1的方法。