博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】不使用WebView来执行Javascript脚本(Rhino)
阅读量:6291 次
发布时间:2019-06-22

本文共 2330 字,大约阅读时间需要 7 分钟。

一、准备

项目地址:

项目说明:由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";
    }
}

 本文转自博客园农民伯伯的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
ClientScriptManager与ScriptManager向客户端注册脚本的区别
查看>>
js和php中几种生成验证码的方式
查看>>
android UI进阶之仿iphone的tab效果1
查看>>
这是我的第1个C#程序(向控制台输出一句话)
查看>>
html
查看>>
Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)
查看>>
Python模块学习:threading 多线程控制和处理
查看>>
第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合
查看>>
bLock 回调 就是这么简单!
查看>>
HTML5 input placeholder 颜色 改动
查看>>
【转】Spring 4.x实现Restful web service
查看>>
第三十一篇:SOUI布局之相对于特定兄弟窗口
查看>>