当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-10-30

    本文导语:  下载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 savedInstance...

下载Rhino 使用PackageManager获得应用信息实例方法 iis7站长之家

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


    
 
 

您可能感兴趣的文章:

  • 菜鸟问题:********如何在Javascript中使用ADO**********
  • 如何使用javascript语言实现在打开PAGE的时候,自动弹出另外一个窗口PAGE2,
  • 使用JavaScript实现的Flash运行环境 Gordon
  • 如何使用javascript语言实现在打开PAGE的时候,自动弹出另外一个窗口PAGE2,
  • 请问如何在Javascript中使用JSP语句?
  • 请教JSP变量在JavaScript中使用的问题.
  • Javascript里的两种使用正则的方法
  • 散点分,顺便问一下哪位有JavaScript的使用帮助资料<主要是里面的各种对象及方法属性的使用>
  • 为何我使用javascript中location'****.jsp'跳到某一页面,jsp页面不重新编译执行
  • 如何使用javascript语言实现在打开PAGE的时候,自动弹出另外一个窗口PAGE2,
  • 如何使用javascript语言实现在打开PAGE的时候,自动弹出另外一个窗口PAGE2,
  • javascript如何在.js文件中使用jsp中的变量
  • 想嵌套使用javascript,和jsp
  • 请问在Mozilla中如何使用click()事件?(javascript,html)。快快帮我啊!
  • python使用PyV8执行javascript代码示例分享
  • JavaScript 使用正则表达式进行表单验证的示例代码
  • 使用jQuery异步加载 JavaScript脚本解决方案
  • Javascript中使用exec进行正则表达式全局匹配时的注意事项
  • 关于javascript冒泡与默认事件的使用详解
  • javascript 正则表达式(二) 使用技巧说明
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 类的方法和实例方法,类字段和实例字段有什么不同,在使用上?
  • Python namedtuple(命名元组)使用实例
  • LINUX中实现单实例功能使用哪种IPC好啊?
  • boost库区间range基本原理及使用实例
  • android 弹出提示框的使用(图文实例)
  • c++类库Boost::bimap(双向映射)介绍及使用实例
  • 使用PackageManager获得应用信息实例方法
  • mongodb 数据库常用命令使用实例
  • android自动安装apk代码实例(不使用apk安装器安装)
  • java获取当前日期使用实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下不使用sudo命令执行docker的操作步骤
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • SUSE10下,如何使用perl语言执行一条语句:从一台机器telnet到远端另一台机器,在远端机器上执行命令,并能获取到执行结果。请高手指点,Very 谢谢~
  • 关于在QT环境下加载gif图片的问题(可以显示,但是只有使用终端启动可执行文件才能显示,双击执行却不显示)这是为什么?
  • 如何使用crontab来定时执行一个.php的程序
  • 使用Statement.java里的execute执行存储过程问题
  • 关于如何使用shell自动执行一个sybase的存储过程
  • 使用终端远程执行程序的问题!
  • 使用java执行定时任务示例
  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • 有谁使用过cgywin吗?它有文字编辑的执行文件吗?
  • 如何让用户只能使用sftp而且不能执行其他shell命令
  • Unix下System函数实现中为何要使用shell去调用执行程序?
  • 我想使用snoop命令,可是又不是root用户,可否设置我的帐户可以执行snoop呢?
  • 请问:在HP-UX下如何替换正在使用的可执行文件?
  • 在使用main时怎样执行参数的命令
  • 求教:使用crontab如何完成每间隔80分钟的执行一个命令的方法?
  • gcc使用的问题,为什么不能执行a.out文件?
  • 关于java中执行sql语句使用order by的问题!
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 使用ssh远程执行程序出现问题
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Python不使用print而直接输出二进制字符串
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3