能否在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
相关产品推荐
相关产品推荐

