在 Android Studio 中寻求基于 Kotlin 的编译器应用程序的 API 推荐 [已关闭]

问题描述 投票:0回答:1

我正在使用 Kotlin 在 Android Studio 中开发编译器应用程序。尽管尝试了各种 API,但我还没有找到任何适合我的项目的 API。我正在寻求您的帮助,如果您能为我提供一个可以成功实现的 API,我将不胜感激。

your text

我正在使用 Kotlin 在 Android Studio 中开发编译器应用程序,但我尝试过的 API 都不起作用。我需要帮助找到可以成功实施的合适 API。

android api kotlin compiler-construction
1个回答
0
投票

使用 Kotlin 通过 Android Studio 开发编译器应用程序时,尤其是在 API 方面,这是非常令人沮丧的。在这里,您将找到一些选项和步骤来实现编译器,而不会给您的应用程序带来压力:

javax.tools.JavaCompiler API 是标准 Java 平台 API,通常用于从 Java 程序中编译 Java 源文件。然而,从 Android 应用程序运行此 API 可能需要一些调整,因为限制适用于 Android。

import javax.tools.ToolProvider

fun compileJavaSource(javaSource: String): Boolean {
    val compiler = ToolProvider.getSystemJavaCompiler()
    if (compiler == null) {
        println("No compiler available")
        return false
    }
    val result = compiler.run(null, null, null, javaSource)
    return result == 0
}

Kotlin 编译器可作为命令行工具使用,但您也可以通过编程方式使用它。可以通过一些解决方法将 KotlinCompiler 集成到您的应用程序中。

import org.jetbrains.kotlin.cli.common.CLICompiler
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler

fun compileKotlinSource(kotlinSource: String): Boolean {
    val args = arrayOf("-kotlin-home", "path/to/kotlin/home", "-d", "outputDir", kotlinSource)
    val result = CLICompiler.doMainNoExit(K2JVMCompiler(), args)
    return result == 0
}

出于性能和安全原因,使用基于云的编译器 API 将编译工作卸载到服务器通常是有效的。以下是一些流行的基于云的编译器 API。 JDoodle API – 支持 70 多种语言,并提供 RESTFul API 来运行代码。

import okhttp3.*
import org.json.JSONObject
import java.io.IOException

fun compileWithJDoodle(code: String, language: String, versionIndex: String): String? {
    val client = OkHttpClient()
    val json = JSONObject()
    json.put("script", code)
    json.put("language", language)
    json.put("versionIndex", versionIndex)
    json.put("clientId", "YOUR_CLIENT_ID")
    json.put("clientSecret", "YOUR_CLIENT_SECRET")

    val requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json.toString())
    val request = Request.Builder()
        .url("https://api.jdoodle.com/v1/execute")
        .post(requestBody)
        .build()

    var responseText: String? = null
    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            e.printStackTrace()
        }

        override fun onResponse(call: Call, response: Response) {
            response.use {
                if (!response.isSuccessful) throw IOException("Unexpected code $response")
                responseText = response.body()?.string()
            }
        }
    })

    return responseText
}

确保将 YOUR_CLIENT_ID 和 YOUR_CLIENT_SECRET 替换为 JDoodle 提供的确切凭据。

如果没有令人满意的API可用,也许可以通过后端服务器实现自定义编译服务。该服务将编译代码并将编译结果返回到您的 Android 应用程序。 有了这两种选择,您应该能够找到一个不错的解决方案来在 Android 应用程序中实现编译器。对于具体要求或遇到问题,请在此处发表评论,以便社区可以提供进一步帮助。

© www.soinside.com 2019 - 2024. All rights reserved.