You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Kotlin JVM项目中调用JavaScript函数?

当然可以在Kotlin JVM项目里调用JavaScript函数啦!下面我给你两种常用的实现方案,直接适配你的JS类就能用:

方法一:使用JDK脚本引擎(通用兼容方案)

这个方案依赖JDK自带的脚本引擎能力,不过要注意Java版本差异:

  • Java 8~14 自带Nashorn引擎,无需额外依赖
  • Java 15及以上,Nashorn被移除,需要手动添加GraalJS依赖(Gradle Kotlin DSL示例):
dependencies {
    implementation("org.graalvm.js:js:21.3.0")
    implementation("org.graalvm.js:js-scriptengine:21.3.0")
}

接下来是JS类的实现,支持直接定义JS函数调用,也能调用外部JS文件里的函数:

import javax.script.ScriptEngineManager
import javax.script.ScriptEngine

class JS {
    fun callJS() {
        // 获取JavaScript引擎实例
        val engine: ScriptEngine = ScriptEngineManager().getEngineByName("javascript")
        
        // 场景1:直接在代码中定义并调用JS函数
        engine.eval("""
            function greet(username) {
                return "Hey, " + username + "! 👋";
            }
        """)
        // 调用greet函数,传入参数并获取结果
        val greetResult = engine.eval("greet('Kotlin Dev')")
        println(greetResult) // 输出: Hey, Kotlin Dev! 👋

        // 场景2:调用resources目录下外部JS文件的函数(假设你有test.js文件)
        val jsFileReader = this::class.java.getResourceAsStream("/test.js").bufferedReader()
        engine.eval(jsFileReader)
        // 调用test.js里定义的externalCalculate函数
        val calculateResult = engine.eval("externalCalculate(10, 3)")
        println(calculateResult)
    }
}
方法二:基于GraalVM的高性能调用

如果你的项目采用GraalVM作为运行时,推荐用这种更现代、性能更好的方式,支持更灵活的JS交互:

import org.graalvm.polyglot.Context
import org.graalvm.polyglot.Value

class JS {
    fun callJS() {
        // 自动管理Context资源(use块会自动关闭)
        Context.create().use { context ->
            // 场景1:定义并调用JS函数
            val addResult = context.eval("js", """
                function add(a, b) {
                    return a + b;
                }
                add(7, 2);
            """)
            println(addResult.asInt()) // 输出: 9

            // 场景2:调用外部JS模块(比如test.js导出了multiply函数)
            val jsFilePath = this::class.java.getResource("/test.js").path
            val jsModule: Value = context.eval("js", java.nio.file.Files.readString(java.nio.file.Paths.get(jsFilePath)))
            // 调用模块里的multiply函数
            val multiplyResult = jsModule.getMember("multiply").execute(6, 4)
            println(multiplyResult.asInt()) // 输出: 24
        }
    }
}

小提示

  • 如果调用复杂的JS逻辑,建议把JS代码单独放在文件里,便于维护
  • GraalVM方式支持更多现代JS特性(比如ES6+),性能也比传统Nashorn好很多

内容的提问来源于stack exchange,提问作者Yuriy Hladyuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:53:45