请问 kotlin 的跨平台靠谱吗?

324 天前
 aaorn1201

现有项目是基于安卓的,用的原生 java 开发,硬件层面有与 usb 、rs485 设备的交互,软件层面有人脸识别 sdk 的调用。如果把这个项目移植到桌面 windows/linux 平台,最小代价是否使用 java 的 kotlin ? qt/nodejs ( electron )需要重新学习。谢谢指教。

7399 次点击
所在节点    Android
20 条回复
Helsing
324 天前
kmm 现在的库比较少,迁移起来估计工作量不小,而且这个主要是用来写业务层代码的

UI 层你还要用到 Compose
aaorn1201
324 天前
@Helsing 请问 jetpack compose 如何调用不同平台的系统功能以及与 usb 、串口等硬件交互的? flutter 是通过把原生平台相应功能封装成插件的形式,compose 是否也是类似的?
Helsing
324 天前
@aaorn1201 #2
这是 KMM 要做的事情吧,用 expect 可以针对不同平台适配
Masoud2023
324 天前
语言不支持,那就找个支持的语言做 RPC🤣
aaorn1201
324 天前
@Helsing kmm 支持 win/linux ?我以为只支持 android/ios 。
lisongeee
324 天前
kmm compose 目前是支持全平台的,#3 说得对,需要使用 expect 实现不同平台的逻辑

<https://github.com/JetBrains/compose-multiplatform/#readme>
rosu
324 天前
先把项目的第三方依赖都排一下,看看是不是都支持 kmm……不然迁移到一半发现第三方库不支持就 g
roundgis
324 天前
AaronLee01
324 天前
你想要做的可能是 Compose MultiPlatform, 但是既然你 Android 项目是 Java 写的,如果你没有 Compose 的经验的话,还是要学习的,UI 层可以 Compose 实现 https://www.jetbrains.com/lp/compose-multiplatform/
janus77
324 天前
我觉得你这种情况做不了跨平台,涉及到硬件设备和人脸识别,只有使用原方案提供商提供的各平台 sdk 重新写项目才行
TArysiyehua
324 天前
你的核心功能是:硬件层面有与 usb 、rs485 设备的交互,软件层面有人脸识别 sdk 的调用

这种情况没一个都得单独写 native api ,比如 usb ,安卓,ios ,window 的 api 都是不一样的,都需要单独写代码去适配。这个出后跟 kmm 是没什么关系的了,kmm 是让你写业务代码,它的第三方非常少。
相关成熟的框架, flutter/qt/electorn 他们在每个平台都有解决方法,你只需要调用对应的第三方库即可, 置于楼上说的 Compose 不过是一个 UI 框架,基本用任意一个跨平台方案都能实现。


所以你目前应该调查的是上面说的几个跨平台方法中,是否有能支持你说的这几个核心功能的第三方库,如果没有的话,就像 7 楼说的那样,迁移到一半发现某个功能不支持,你就 GG 了
alwjlola
324 天前
不靠谱,没生态
elechi
324 天前
不靠谱,用 java 重写吧
aaorn1201
324 天前
了解了,感谢各位的输入。
aaorn1201
324 天前
@roundgis windows 居然是 Tier 3 。。。
xieren58
324 天前
win/linux 建议用 https://avaloniaui.net
roundgis
324 天前
@aaorn1201 畢竟還是剛起步 用的人也不多 需要同行踩坑
learningman
324 天前
几乎完全不可用,建议不要上生产。
或者你能接受你的代码里有 1 万个 work around
x77
323 天前
跨平台的主角是框架,不是语言。

几乎每种语言都能在不同的硬件 /系统平台上编写软件,都可以适配不同的平台,但是这其中包含了大量的开发和维护工作。开发者为不同的平台进行适配,开发不同平台的软件版本,已经和跨平台框架的意义相差甚远了。

拿 Flutter 跨平台框架来讲,它最上层通常有一种通用的语言平台无关的 Dart 语言进行开发,框架自己会适配不同的平台(不是浏览器套壳,封装 JS 那种),一般的软件,你只需要写 Dart 就可以在 Windows 、Linux 、Mac 、Android 、iOS 等等系统上(原生)运行。

跨平台框架能够组织各个平台(各种语言的)底层代码,做统一的抽象在最上层调用。对于 usb 、rs485 设备的交互,你只需要用 C 实现一遍,然后封装成 Flutter 插件就可以,其他第三方 SDK 也类似,做成插件。虽然上层代码都一致,但是在 Windows 上 Flutter 会调用你 Windows 上的底层代码,Linux 上则会调用 Linux 的底层代码。。。

非常不建议用 Kotlin/Java 去适配不同的平台,这么做不能叫“跨平台”
driscoll
179 天前
@x77 KMP 刚推出 stable 版本,现在来看还是这样吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/949835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX