当前位置: 移动技术网 > IT编程>开发语言>Java > 使用Rhino让java执行javascript的方法实例

使用Rhino让java执行javascript的方法实例

2019年07月22日  | 移动技术网IT编程  | 我要评论

下载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的方法。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网