Kotlin在没有webView的Android中调用Javascript函数

Bha*_*ina 11 javascript android webview kotlin kotlin-js-interop

有没有什么方法可以在没有WebView的情况下从Kotlin调用JS函数?

让我们说如下所述我helloJS()test.js文件中有一个JS函数,

test.js: -

function helloJS(){
    return "Hello from JS"
}
Run Code Online (Sandbox Code Playgroud)

现在我想从Kotlin文件中调用此函数

TestClass.kt: -

class TestHello{

    fun getHelloFromJS(){
        val name = test.helloJS()
    }
}
Run Code Online (Sandbox Code Playgroud)

直到现在我正在使用Webview并将JS文件加载到该文件中并将结果作为回调获取

但是,我读到Kotlin可以像JS那样与JS互操作

所以我很想知道在没有webView的情况下我们是否可以在Android上使用它

Nir*_*tel 9

这是不可能的直接前进但我发现一个库在没有WebView的Android中执行JavaScript来实现这一点.

仔细阅读该博客并按照以下步骤操作.

将你的JavaScript文件(test.js)保存在android项目的assets文件夹中.

我已将该代码转换为Kotlin.

CallJavaScript.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
    }
}
Run Code Online (Sandbox Code Playgroud)

将此行添加到build.gradle:

implementation 'org.mozilla:rhino:1.7R4'
Run Code Online (Sandbox Code Playgroud)

在您的assets文件夹中,创建一个名为的文件test.js:

function helloJS()
{
    return "Hello from JS";
}
Run Code Online (Sandbox Code Playgroud)

现在只需从Activity调用上面的函数.

 Log.e("JS : ", CallJavaScript.callFunction(this).toString());
Run Code Online (Sandbox Code Playgroud)

输出:

E/JS :: Hello from JS
Run Code Online (Sandbox Code Playgroud)


Gae*_*anZ 6

这是不可能的.您不得将语言与平台混淆.

Kotlin可以像JS一样与JS互操作

意味着Kotlin/JS可以在Javascript平台(Node.js或浏览器)中使用和使用.编译(转换)成js的Kotlin代码能够调用其他js文件.外部Js代码可以从Kotlin调用js代码构建.这是与JS的互操作性.

Kotlin/JS和Kotlin/JVM之间没有互操作性.

在此输入图像描述