Documentação oficial

Suporte móvel

Referência técnica de Suporte móvel — Joss language and Joss Red ecosystem.

Suporte móvel: Android e iOS

Joss oferece execução e desenvolvimento em plataformas móveis por meio de duas abordagens: 1. CLI e binários independentes no Android (Termux / ADB): Permite executar e compilar scripts Joss diretamente em dispositivos Android. 2. SDK incorporável libjoss (pkg/mobile) para Android e iOS: Permite integrar o motor Joss a aplicativos nativos e híbridos escritos em Kotlin (Android) e Swift (iOS). É ideal para aplicativos educacionais como Aprende más, ambientes de teste interativos ou execução de regras de negócio no cliente.


1. Abordagem A: CLI independente no Android

O Android é baseado no kernel Linux e permite executar binários ELF estáticos.

Arquiteturas compatíveis

O compilador cruzado nativo de Joss oferece suporte às quatro arquiteturas padrão do Android: - android/arm64 (a maioria dos telefones modernos) - android/arm (dispositivos antigos de 32 bits) - android/amd64 (emuladores x86_64 do Android Studio) - android/386 (emuladores antigos de 32 bits)

Compilação cruzada a partir da máquina de desenvolvimento

Para compilar a CLI de Joss ou um projeto Joss autocontido para Android:

# Compilar un script o proyecto para Android arm64
joss build native android arm64

# O compilar el CLI completo directamente con Go
CGO_ENABLED=0 GOOS=android GOARCH=arm64 go build ./cmd/joss

Transfira o binário resultante para o dispositivo e instale-o no Termux:

# En el terminal de Termux en Android:
chmod +x joss
mv joss $PREFIX/bin/
joss version

[!NOTE] O iOS não oferece um console de comandos independente por causa das políticas de segurança e sandboxing da Apple. Por isso, o suporte no iOS é fornecido pelo SDK incorporável descrito na Abordagem B.


2. Abordagem B: SDK incorporável libjoss (pkg/mobile)

O pacote github.com/jossecurity/joss/pkg/mobile expõe uma API de alto nível para aplicativos móveis desenvolvidos com Java, Kotlin, Swift, Flutter ou React Native.

Métodos da API

Função Descrição Retorno
Run(source string, timeoutMs int) Executa código-fonte Joss, captura stdout e stderr e aplica um limite de tempo para proteger contra loops infinitos.

| JSON ExecutionResult | | Analyze(source string) | Realiza análise estática e sintática sem executar o código; relata diagnósticos com linha e coluna para editores móveis.

| JSON AnalysisResult | | Version() | Retorna a versão atual do motor Joss.

| string |

Estrutura da resposta JSON (ExecutionResult)

{
  "success": true,
  "stdout": "Hola desde Joss en Android!\n",
  "stderr": "",
  "error": "",
  "timed_out": false,
  "duration_ms": 15,
  "diagnostics": []
}

Se o código contiver um erro de sintaxe ou tipo, success será false e diagnostics conterá os detalhes necessários para destacar o erro na interface do aplicativo:

{
  "success": false,
  "error": "JOSS-TYPE-001: tipo incompatible",
  "duration_ms": 2,
  "diagnostics": [
    {
      "code": "JOSS-TYPE-001",
      "severity": "error",
      "message": "no se puede asignar string a int",
      "line": 3,
      "column": 5,
      "suggestion": "declara el tipo compatible o usa mixed"
    }
  ]
}

3. Integração no Android (Kotlin / Jetpack Compose)

Em aplicativos como Aprende más, invoque o SDK a partir de um ViewModel ou serviço de execução.

Exemplo em Kotlin

// Invocación del motor Joss desde Kotlin
fun ejecutarCodigoJoss(codigoFuente: String): JossResult {
    // timeout de 3000 ms para evitar que bucles infinitos cuelguen la app
    val resultadoJson: String = Mobile.run(codigoFuente, 3000)
    return Gson().fromJson(resultadoJson, JossResult::class.java)
}

data class JossResult(
    val success: Boolean,
    val stdout: String,
    val stderr: String,
    val error: String?,
    val timed_out: Boolean?,
    val duration_ms: Long,
    val diagnostics: List<JossDiagnostic>?
)

data class JossDiagnostic(
    val code: String,
    val severity: String,
    val message: String,
    val line: Int,
    val column: Int,
    val suggestion: String?
)

4. Integração no iOS (Swift / SwiftUI)

No iOS, inclua o SDK no projeto Xcode como um .xcframework.

Exemplo em Swift

import SwiftUI
import JossMobile

class JossRunnerViewModel: ObservableObject {
    @Published var salida: String = ""
    @Published var estaEjecutando: Bool = false

    func ejecutar(codigo: String) {
        estaEjecutando = true
        DispatchQueue.global(qos: .userInitiated).async {
            // timeout de 3 segundos
            let jsonString = MobileRun(codigo, 3000)
            
            if let data = jsonString.data(using: .utf8),
               let result = try? JSONDecoder().decode(JossResult.self, from: data) {
                DispatchQueue.main.async {
                    self.salida = result.success ? result.stdout : (result.error ?? "Error desconocido")
                    self.estaEjecutando = false
                }
            }
        }
    }
}

5. Compilação do SDK para produção

Gerar AAR para Android com gomobile

go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
gomobile bind -target=android -o libjoss.aar ./pkg/mobile

Coloque o arquivo libjoss.aar gerado no diretório app/libs/ do Android Studio.

Gerar XCFramework para iOS com gomobile

gomobile bind -target=ios -o JossMobile.xcframework ./pkg/mobile

Arraste o diretório JossMobile.xcframework para a seção Frameworks, Libraries, and Embedded Content do projeto Xcode no macOS.