如何在Android执行js代码(非WebView)

404 阅读1分钟

前情提要:
公司项目涉及到用Java/Kotlin调用JavaScript代码,但是使用ScriptEngineManager的方案无效,原因是Android自带的SDK调用不到,导入jar包也报错。

这里采用另外一个方案,特此记录,供大家参考。


  1. 依赖

implementation 'org.mozilla:rhino:1.7.10'
  1. 处理类名冲突

导入org.mozilla.javascript.Context设置一个别名JsContext,避免与android.content.Context冲突

import org.mozilla.javascript.Context as JsContext
  1. 执行

/**
 * 执行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}")
        ""
    }
}

// 执行