android 是否可以在公共KMP模块中使用具有特定于平台的依赖关系的本机库?

8yoxcaq7  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(86)

我的应用程序使用本机库A。它构建为A.soAndroid的www.example.com和iOS的A.framework,并且在两个平台上具有相同的代码库。此库依赖于另一个本地库B,该库内置于B.so和B.framework for Android和iOS中。库B具有相同的接口,但在平台上的实现方式不同,并使用iOS和Android API。
我想做一个模块,它将封装库A和B,并提供某种统一的接口来使用它们。将来我想在KMP应用程序中使用此模块。
我可以将A和B组装到一个通用的KMP模块中,以便在两个平台上使用吗?
我搜索了类似的问题,但没有找到任何东西。有很多问题询问如何将本机库与KMP一起使用,但在这些情况下,库对于所有目标都是相同的,并且没有特定于平台的API。

okxuctiv

okxuctiv1#

是的,这是绝对可能的,但正如你可能想象的那样,有几个移动的部分参与。
去年我做了一个关于这个的演讲。托管视频的网站错误地标记了它,但谈话是关于桥接KMP的本地代码。我有意跳过了配置JNI,但是如果您已经这样做了,您可以编写一个公共层来委托给两者,并且讨论如何添加本机端。
https://www.droidcon.com/2022/06/28/sdk-design-and-publishing-for-kotlin-multiplatform-mobile/
有关此操作的公开示例,请参阅CashApp团队的Zipline。他们正在为这两个平台构建C,并在Android上使用JNI和在iOS上使用cinterop与他们交谈。他们在本机端使用我们的一个库来将C二进制文件打包为库,这可能是您不需要的,但它确实使分发变得更容易(请参阅cklib)。
举一个挂载本机库和编写公共接口层的例子,我们使用CrashKiOS为Crashlytics和Bugsnag完成了这一操作。仅供参考,我们目前正在与Kotlin构建本地测试时的链接器问题作斗争。这是因为我们不想在库构建中直接包含本机依赖项,但您可能不会遇到这个问题。

相关问题