1
votes

Problème Kotlin / Native lors de l'importation des journaux Android dans le module de code partagé Android

J'essaie d'utiliser les journaux Android dans mon code partagé, je voulais donc utiliser la fonctionnalité "attendu / réel" afin de permettre au côté Android d'utiliser les journaux à lire dans le chat de journal. Cependant, je ne peux pas obtenir le module android (pas le module d'application) pour importer le android.util.Log.

J'ai vu cette réponse mais cela n'a pas fonctionné pour moi. Je ne parviens pas à résoudre l’importation.

Je pense que j'ai besoin d'implémenter une dépendance spécifique pour avoir accès à l'importation mais je ne suis pas sûr de ce que c'est.

Voici mon build.gradle.kts

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
}


kotlin {
    //select iOS target platform depending on the Xcode environment variables
    val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
        if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
            ::iosArm64
        else
            ::iosX64

    iOSTarget("ios") {
        binaries {
            framework {
                baseName = "SharedCode"
            }
        }
    }



jvm("android")

sourceSets["commonMain"].dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
    implementation("io.ktor:ktor-client:1.0.0-beta-3")

    implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.2")
 //   implementation ("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:0.14.0")
}

sourceSets["androidMain"].dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib") //Allows _androidMain to have java imports
    implementation("io.ktor:ktor-client-android:1.0.0-beta-3")
    api("org.jetbrains.kotlin:kotlin-stdlib:1.3.61")
    api("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61")
    }
}

val packForXcode by tasks.creating(Sync::class) {
    val targetDir = File(buildDir, "xcode-frameworks")

    /// selecting the right configuration for the iOS
    /// framework depending on the environment
    /// variables set by Xcode build
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val framework = kotlin.targets
        .getByName<KotlinNativeTarget>("ios")
        .binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)

    from({ framework.outputDirectory })
    into(targetDir)

    /// generate a helpful ./gradlew wrapper with embedded Java path
    doLast {
        val gradlew = File(targetDir, "gradlew")
        gradlew.writeText("#!/bin/bash\n"
            + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
            + "cd '${rootProject.rootDir}'\n"
            + "./gradlew \$@\n")
        gradlew.setExecutable(true)
    }
}

tasks.getByName("build").dependsOn(packForXcode)


0 commentaires

3 Réponses :


2
votes

Ici, vous avez une cible JVM avec le nom "android" au lieu de la cible Android. Le même problème s'est produit dans la question liée. Pouvez-vous dire ce qui se passe lorsque vous utilisez le script de la réponse? Il semble que celui-ci devrait fonctionner correctement.
Comme décrit dans la documentation , on a pour utiliser un plugin Gradle spécifique à Android pour rendre la cible Android disponible. Si vous voulez voir comment cela peut être fait, envisagez de jeter un œil à cet exemple .


1 commentaires

J'ai essayé d'utiliser le script mais je commence à recevoir un tas d'autres erreurs. J'ai trois fichiers build.gradle, l'application habituelle et le projet un et un kotlin (pas groovy) qui, je suppose, est de faire fonctionner le mmp. Il semble que le script publié effectue une partie du travail de build.gradle (application). J'ai essayé de remplacer JVM ("android") par android () mais j'obtiens une erreur de construction. L'extension avec le nom "android" n'existe pas



1
votes

J'ai eu le même problème. Essayez d'utiliser android () au lieu de seulement jvm ("android") .

J'ai également ajouté mes dépendances à Android avec android.sourceSets.foreach {_ -> dépendances {...} }


2 commentaires

J'ai essayé mais j'obtiens une erreur de construction: l'extension avec le nom «android» n'existe pas.


Essayez d'ajouter le plugin Android avec plugins {id ("com.android.library")}



1
votes

Je viens de corriger le même problème, j'ai finalement utilisé ce tutoriel https://medium.com/icerock/how-to-start-use-kotlin-multiplatform-for-mobile-development-1d3022742178 donc mon build.gradle ressemble à:

apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.multiplatform'

android {
    compileSdkVersion 29
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 29
    }
}

kotlin {
    targets {
        android()
        iosArm64()
        iosX64()
    }

sourceSets {
    commonMain {
        dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
        }
    }
    androidMain {
        dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        }
    }
}
}


0 commentaires