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上使用它
这是不可能的直接前进但我发现一个库在没有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)
这是不可能的.您不得将语言与平台混淆.
Kotlin可以像JS一样与JS互操作
意味着Kotlin/JS可以在Javascript平台(Node.js或浏览器)中使用和使用.编译(转换)成js的Kotlin代码能够调用其他js文件.外部Js代码可以从Kotlin调用js代码构建.这是与JS的互操作性.
Kotlin/JS和Kotlin/JVM之间没有互操作性.
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |