Проблема сборки Kotlin / native cinterop с Gradle - PullRequest
0 голосов
/ 07 января 2020

Я экспериментирую с Kotlin native и iOS. Я попытался использовать пример на raywenderlich в качестве отправной точки. Этот пример немного устарел, поэтому я обновил код, чтобы он соответствовал мультиплатформе Kotlin 1.3.61. Я использую AppCode для создания кода.

Я борюсь с Kotlin DSL gradle-файлом (build.gradle.kts), в примере используется build.gradle:

plugins {
    id "org.jetbrains.kotlin.platform.native" version "1.3.0"
}

components.main {

    def productsDir = new File("").absolutePath

    targets = ['ios_arm64', 'ios_x64']
    outputKinds = [EXECUTABLE]

    allTargets {
        linkerOpts '-rpath', '@executable_path/Frameworks'
        linkerOpts "-F${productsDir}"
    }

    dependencies {
        cinterop('AFNetworking'){
            packageName 'com.afnetworking'
            compilerOpts "-F${productsDir}"
            linkerOpts "-F${productsDir}"
            includeDirs{
                allHeaders "${productsDir}/AFNetworking.framework/Headers"
            }
        }
    }
}

task copyExecutable() {
    doLast {
        def srcFile = tasks['compileDebugIos_x64KotlinNative'].outputFile
        def targetDir = getProperty("konan.configuration.build.dir")
        copy {
            from srcFile.parent
            into targetDir
        }
    }
}                                                                                                            

Я попытался перевести это в собственный файл build.gradle.kts:

plugins {                                                                                                          
    kotlin("multiplatform") version "1.3.61"                                                                       
    kotlin("xcode-compat") version "0.2.5"
    }
repositories {                                                                                                     
    mavenCentral()                                                                                                 
}                                                                                                                  

kotlin {                                                                                                           
    val productsDir = "/Users/trond/Desktop/native_meteor/native_meteor/"                                          
    iosX64("ios")                                                                                                  
    {                                                                                                              
        compilations.getByName("main")                                                                             
        {                                                                                                          
            val myInterop by cinterops.creating {                                                                  
                defFile(project.file("src/nativeInterop/cinterop/afnetworking.def"))                               
                packageName ("com.afnetworking")                                                                   
                compilerOpts ("-F${productsDir}")                                                                  
             //   linkerOpts ("-F${productsDir}")                                                                  
                // 3                                                                                               
                includeDirs{                                                                                       
                    allHeaders ("${productsDir}/AFNetworking.framework/Headers")                                   
                }                                                                                                  
            }                                                                                                      
        }                                                                                                          

    }                                                                                                              
    xcode {                                                                                                        
        setupApplication("native_meteor")                                                                          
    }                                                                                                              
}

Из того, что я вижу, инструмент cinterops выполняет свою работу и создает файл klib и afnetworing.kt (build / classes / kotlin / ios / main / .....)

Но я не могу использовать библиотеку AFNetworking! Я пытаюсь добавить директиву импорта в файл ViewController.kt:

import com.afnetworking.*

Но это не распознается. Это приводит к тому, что проект не строит:

> Task :native_meteor:compileKotlinNative_meteor FAILED
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (15, 8): Unresolved reference: com
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (37, 23): Unresolved reference: AFHTTPSessionManager
e: /Users/trond/Desktop/native_meteor/native_meteor/src/native_meteorMain/kotlin/ViewController.kt: (40, 38): Unresolved reference: AFJSONResponseSerializer                                                                                                                  

Кто-нибудь, кто может пролить свет на это?

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Спасибо, что указали мне в этом направлении. Я исследовал файл .klib и обнаружил, что он содержит ожидаемый пакет. Затем я взглянул на исходные коды Gradle, которые были на панели Gradle в Appcode. Здесь я обнаружил, что библиотека .klib была определена в «iosMain», а не «native_metorMain». Затем я обнаружил, что строка iosX64 ("ios") должна быть iosX64 ("meteor_main").

После этого я получил ошибку: «ld: framework not found AFNetworking», когда я попытался скомпилировать в XCode. Затем я добавил -F {полный путь к фреймворку} для linkerOpts ( linkerOpts = -F {полный путь к фреймворку} -framework AFNetworking ) в файле afnetworking.def.

Теперь проект успешно строится.

2 голосов
/ 10 января 2020

Возможно, имеет смысл проверить содержимое вашего результата .klib, чтобы убедиться, что вы используете правильное имя пакета. Это можно сделать с помощью инструмента ~/.konan/kotlin-native-macos-1.3.61/bin/klib CLI.
Кроме того, я бы порекомендовал вам взглянуть на этот пример с Kotlin / Native Github, он также использует AFNetworking и использует последнюю версию компилятора.

...