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";
}
}