这不可能直截了当,但我发现一个库在没有 WebView 的情况下在 Android 中执行 JavaScript来实现这一点。
仔细阅读该博客并按照以下步骤操作。
将您的JavaScript
文件 ( test.js
) 保存在 android 项目的 assets 文件夹中。
我已将该代码转换为 Kotlin。
调用JavaScript.jks
import org.mozilla.javascript.Context
import org.mozilla.javascript.Function
import java.io.InputStreamReader
object CallJavaScript {
fun callFunction(mContext: android.content.Context): Any? {
var jsResult: Any? = null
val params = arrayOf<Any>("")
// Every Rhino VM begins with the enter()
// This Context is not Android's Context
val rhino = Context.enter()
// Turn off optimization to make Rhino Android compatible
rhino.optimizationLevel = -1
try {
val scope = rhino.initStandardObjects()
// Note the forth argument is 1, which means the JavaScript source has
// been compressed to only one line using something like YUI
val assetManager = mContext.assets
try {
val input = assetManager.open("test.js")
val targetReader = InputStreamReader(input)
rhino.evaluateReader(scope, targetReader, "JavaScript", 1, null)
} catch (e: Exception) {
e.printStackTrace()
}
// Get the functionName defined in JavaScriptCode
val obj = scope.get("helloJS", scope)
if (obj is Function) {
// Call the function with params
jsResult = obj.call(rhino, scope, scope, params)
// Parse the jsResult object to a String
val result = Context.toString(jsResult)
}
} finally {
Context.exit()
}
return jsResult
}
}
将此行添加到build.gradle
:
implementation 'org.mozilla:rhino:1.7R4'
在您的assets
文件夹中,创建一个名为test.js
:
function helloJS()
{
return "Hello from JS";
}
现在只需从 Activity 调用上述函数。
Log.e("JS : ", CallJavaScript.callFunction(this).toString());
输出 :
E/JS :: Hello from JS