提问者:小点点

静态编程语言多平台/本机互操作性与Object-C框架


我试图在一个多平台项目中从Kotlin调用Swift/Objective-C代码。对平台代码的调用没有问题。但当我尝试调用某个库(或框架,不确定如何正确调用它,因为我不是iOS开发人员)时,它失败了。Docs声明,如果正确导出,则可以调用Objective-C代码和Swift:

静态编程语言/本机提供与Objecte-C的双向互操作性。如果正确导入到构建中(默认情况下导入系统框架),可以在静态编程语言代码中使用目标C框架和库。参见例如。"使用cinterop"在Gradle插件留档。Swift库可以用于静态编程语言代码,如果它的应用编程接口被导出到Objecte-C中。尚不支持纯Swift模块。

但它并没有说明我如何正确地导入它们。它只指向描述gradle插件旧版本的gradle插件描述。所以它对我不起作用。最后我发现了导入Objective-C代码的方法:

fromPreset(presets.iosX64, 'ios') {
        compilations.main.outputKinds('FRAMEWORK')
        compilations.main {
            cinterops {
                firebase {
                    def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
                    includeDirs '${pods}Firebase/CoreOnly/Sources',
                            '${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
                }
            }
        }
    }

构建运行时不会失败,但不会导入任何内容。我做错了什么?有可能导入这样的库吗?

UPD:

在这里,我找到了一个使用cinterop工具的例子,如下所示:

cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def \
 -compilerOpts -I/usr/local/include -o libgit2

看起来cinterop工具应该在我的项目中的/dist/bin/文件夹中,但没有这样的文件夹。在哪里可以获得cinterop工具?


共2个答案

匿名用户

我在build中使用了这个cinterops部分。格拉德尔

    fromPreset(presets.iosX64, 'ios') {
        // This preset is for iPhone emulator
        // Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
        compilations.main {
            outputKinds('FRAMEWORK')
            cinterops {
                firebase {
                    defFile "$projectDir/src/iosMain/cinterop/firebase.def"
                    includeDirs {
                        allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
                                   "$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
                    }

                    compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                    linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
                }
            }
        }
    }

结束此。def文件:

language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h

这是怎么回事?Cocopods框架位于Xcode项目的Pods目录中。浏览一下这个文件夹,你就会找到你需要的东西。我不确定是否有一些标准但firebase将主头文件放在Public文件夹中。它还包含对它需要的其他头文件的引用。。。因此,您可以在中指定这些文件名。标题部分中的def文件。

接下来,您需要指定在哪里查找这些文件以及它们引用的其他文件。您可以在中的. def文件中执行此操作,也可以在build.gradle文件中执行此操作。我更喜欢使用build.gradle文件,因为它可以使用变量。因此,您指定了这些Public文件夹的路径。(这足以让kotlin看到库API,但是为了能够运行应用程序,你需要编译和链接这个库...)

然后,编译器和链接器需要知道库/框架的位置。因此,您可以在compilerOptslinkerOpts中指定框架根文件夹的路径,如果是框架,则在它们前面加上-F,如果是库,则在它们前面加上-L

匿名用户

看起来你要用cocoapods图书馆了。目前Gradle插件不支持开箱即用的cocapods。但可能是依赖于您的库可以“手动”配置。你能分享你的项目的链接吗?