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.