2

我正在尝试使用 Kotlin 本机和 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                                                                                                                  

任何人都可以对此有所了解吗?

4

2 回答 2

3

也许检查结果 .klib 的内容以确保使用正确的包名称是有意义的。可以使用~/.konan/kotlin-native-macos-1.3.61/bin/klibCLI 工具来完成。
另外,我建议您查看 Kotlin/Native Github 中的这个示例,它还利用 AFNetworking 并使用最新的编译器版本。

于 2020-01-10T12:33:56.540 回答
3

谢谢你为我指明了那个方向。我调查了 .klib 文件,发现它包含我期望的包。然后,我查看了我在 Appcode 的 Gradle 窗格中拥有的 Gradle 源集。在这里,我发现 .klib 库是在“iosMain”而不是“native_metorMain”下定义的。然后我发现 iosX64("ios") 应该是 iosX64("meteor_main")。

之后,当我尝试在 XCode 中编译时出现错误:“ld: framework not found AFNetworking”。然后,我在 afnetworking.def 文件中为 linkerOpts ( linkerOpts= -F{full path to framwork} -framework AFNetworking ) 添加了 -F{full path to framework}。

现在项目构建成功。

于 2020-01-13T14:00:00.153 回答