前情提要:
公司项目涉及到用Java/Kotlin调用JavaScript代码,但是使用ScriptEngineManager的方案无效,原因是Android自带的SDK调用不到,导入jar包也报错。
这里采用另外一个方案,特此记录,供大家参考。
-
依赖
implementation 'org.mozilla:rhino:1.7.10'
-
处理类名冲突
导入org.mozilla.javascript.Context设置一个别名JsContext,避免与android.content.Context冲突
import org.mozilla.javascript.Context as JsContext
-
执行
/**
* 执行js的函数封装
*
* !!注意参数一定是一个 js变量 或 执行后可以返回变量的语句
例如:字符串必须传入"'a text'",而不是 "a text"
*/
private fun executeJs(command: String): String {
return kotlin.runCatching {
val jsContext = JsContext.enter().apply {
optimizationLevel = -1
}
val jsScope: Scriptable = jsContext.initStandardObjects()
val result = jsContext.evaluateString(
jsScope,
// 经测试,必须执行函数获得返回值才行,否则会报错
"(function(){return (${command})})();",
"<cmd>",
1,
null
).toString()
Log.e(TAG, "executeJs: OK\t${result}")
result
}.getOrElse {
Log.e(TAG, "executeJs: ERROR\t${it.message}")
""
}
}
// 执行