如何在Android的Kotlin项目中使用TypeScript库?
在Android Kotlin项目中运行TypeScript/JS库的完整方案
先解决你的核心疑问
.d.ts是TypeScript的类型声明文件,仅用于TS开发时的类型提示,不需要编译,实际运行只需要你手里的index.js(这就是TS编译后的可执行JS文件)。
依赖获取选择
优先从Nexus获取:直接用npm install your-lib --save下载库,找到包目录下的dist文件夹(或直接找入口index.js),复制编译后的JS文件到Android项目即可,比手动下载本地文件更能保证版本完整性。如果本地已经有完整的index.js,直接用本地文件也没问题。
具体实现方案
方案1:WebView加载(最简便,全版本兼容)
适合不需要和Kotlin频繁交互的场景,直接用WebView运行JS代码:
- 把
index.js放到Android项目的src/main/assets目录(没有assets文件夹就新建)。 - 在assets目录新建
lib_loader.html,用来引入JS库:
<!DOCTYPE html> <html> <head> <script src="index.js"></script> </head> <body> </body> </html>
- Kotlin代码中初始化WebView并调用JS方法:
val webView = WebView(context) val webSettings = webView.settings webSettings.javaScriptEnabled = true webSettings.allowFileAccess = true // 加载本地HTML webView.loadUrl("file:///android_asset/lib_loader.html") // 加载完成后调用JS库方法 webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) // 替换成你的库实际方法,比如yourLib.calculate(10,20) webView.evaluateJavascript("window.yourLib.calculate(10,20)") { jsResult -> // 处理JS返回的结果,jsResult为字符串格式 Log.d("JSResult", jsResult) } } }
方案2:Android内置JsEngine(Android 12+)
适合轻量场景,不需要WebView,仅支持Android 12(API 31)及以上:
- 同样把
index.js放到assets目录。 - Kotlin代码中读取并执行JS:
// 读取assets中的JS文件内容 val jsContent = context.assets.open("index.js").bufferedReader().use { it.readText() } // 初始化JsEngine并执行 val jsEngine = JsEngine.create() try { jsEngine.evaluate(jsContent) // 调用库方法 val result = jsEngine.evaluate("yourLib.calculate(30,40)") Log.d("JsEngineResult", result.toString()) } finally { jsEngine.close() }
方案3:集成V8引擎(兼容低版本Android)
如果需要兼容Android 12以下版本,使用Google V8引擎:
- 在Module级别的
build.gradle添加依赖:
dependencies { implementation "com.eclipsesource.j2v8:j2v8-android:6.2.0" }
- Kotlin代码中执行JS:
val jsContent = context.assets.open("index.js").bufferedReader().use { it.readText() } val v8 = V8.createV8Runtime() try { v8.executeScript(jsContent) // 调用库方法,根据返回值类型选择对应execute方法 val result = v8.executeIntegerScript("yourLib.calculate(50,60)") Log.d("V8Result", result.toString()) } finally { v8.release() }
内容的提问来源于stack exchange,提问作者Aethia
相关产品推荐
相关产品推荐

