Kotlin Call Javascript функция в Android без веб-просмотра

Есть ли способ, которым мы можем вызвать функцию JS из Kotlin, не имея WebView в Android?

Допустим, как упоминалось ниже, у меня есть одна функция JS helloJS() в файле test.js,

test.js: -

function helloJS(){
    return "Hello from JS"
}

И теперь я хочу вызвать эту функцию из файла Kotlin, как

TestClass.kt:-

class TestHello{

    fun getHelloFromJS(){
        val name = test.helloJS()
    }
}

До сих пор я использую Webview и загружаю в него файл JS и получаю результат как обратный вызов

Но я читал, что Kotlin совместим с JS, как Java

Поэтому мне любопытно узнать, есть ли способ использовать это на Android, не имея webView

4 ответа

Это невозможно прямо сейчас, но я нашел одну библиотеку для выполнения JavaScript в Android без WebView для достижения этой цели.

Внимательно прочитайте этот блог и следуйте инструкциям ниже.

Держите ваши JavaScript файл (test.js) в папке активов в проекте Android.

Я преобразовал этот код в 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
    }
}

Добавить эту строку в 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

Это невозможно. Вы не должны путать язык с платформой.

Kotlin совместим с JS, как Java

означает, что Kotlin/JS можно использовать и использовать на платформе Javascript (Node.js или браузеры). Код Kotlin, скомпилированный (перенесенный) в js, может вызывать другие js-файлы. А внешний код Js может вызывать сборку кода Js из Kotlin. Это совместимость с JS.

Взаимодействие между Kotlin/JS и Kotlin/JVM отсутствует.

Я не профессионал в Котлине, но Java - это пирог для меня. Все, что вы можете реализовать в Java, может быть реализовано в Kotlin. Чтобы выполнить код Javascript, я использую rhino, который делает работу намного проще, чем с помощью веб-представления.

try {
   Scriptable scope = rhino.initStandardObjects();
   rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null);
   Object obj = scope.get(functionNameInJavaScriptCode, scope);

   if (obj instanceof Function) {

       Function jsFunction = (Function) obj;
       // Call the function with params
       Object jsResult = jsFunction.call(rhino, scope, scope, params);
       // Parse the jsResult object to a String
       String result = Context.toString(jsResult);
   }

}finally {
   Context.exit();
}

Kt выглядит как JS, но это не так. Он будет скомпилирован для среды выполнения Android, а не для механизма сценариев Java.

Код JS требует времени выполнения JS, но его нет в среде выполнения Android.

т.е. вы не можете запустить JS напрямую в коде Java / Kt для Android.

Другие вопросы по тегам