【发布时间】:2018-08-19 20:33:26
【问题描述】:
我目前正在考虑将我开始使用 react-native 开发的应用程序移植到代号one。为此,我仍在检查可行性和它需要的工作量(因为我必须移植或开发一些从 react-native 到 codenameone 的本机库绑定,因为 codenameone 错过了我的一些需求,比如 socket.io 支持例子)。免费的代号构建云服务仅限于 1Mb 的应用程序,我必须在本地进行测试构建(只有少数测试类和使用谷歌地图 cn1lib,我的测试应用程序已经超过 1Mb 限制) 可悲的是,没有关于如何执行本地构建的代号免费文档,实际上我在互联网上找不到任何关于如何执行此操作的说明(我只在博客文章中找到了一些关于如何执行的基本和已弃用的说明一个本地 iOS 版本,但对 Android 没有)。所以我必须自己弄清楚... 在花了一些时间研究 gradle 配置参数之后,我终于成功地构建了一个基本的代号本地应用程序,该应用程序可以在我的 android 测试设备上运行。但问题是,当我添加一个外部 cn1lib (谷歌映射本机 cn1lib https://github.com/codenameone/codenameone-google-maps )时,我的应用程序在打开依赖于该库的屏幕时出现错误。 在 android 错误日志中,我可以找到以下消息:
D/MyApplication( 551): [EDT] 0:0:0,99 - Exception: java.lang.ClassCastException - com.codename1.googlemaps.InternalNativeMapsImpl cannot be cast to com.codename1.system.NativeInterface
W/System.err( 551): java.lang.ClassCastException: com.codename1.googlemaps.InternalNativeMapsImpl cannot be cast to com.codename1.system.NativeInterface
W/System.err( 551): at com.codename1.system.NativeLookup.create(Unknown Source)
W/System.err( 551): at com.codename1.googlemaps.MapContainer.<init>(MapContainer.java:171)
W/System.err( 551): at com.codename1.googlemaps.MapContainer.<init>(MapContainer.java:151)
W/System.err( 551): at com.tbdlab.testapp.MyApplication.start(MyApplication.java:207)
W/System.err( 551): at com.tbdlab.testapp.MyApplicationStub.run(MyApplicationStub.java:183)
W/System.err( 551): at com.codename1.ui.Display.processSerialCalls(Unknown Source)
W/System.err( 551): at com.codename1.ui.Display.mainEDTLoop(Unknown Source)
W/System.err( 551): at com.codename1.ui.RunnableWrapper.run(Unknown Source)
W/System.err( 551): at com.codename1.impl.CodenameOneThread$1.run(Unknown Source)
W/System.err( 551): at java.lang.Thread.run(Thread.java:818)
我真的不明白为什么 InternalNativeMapsImpl 无法转换为 NativeInterface,因为我查看了已编译的 apk 的 dex 文件,并且正确包含了来自 google maps cn1lib 的所有必要类(适用于 android)(所以我有 @ 987654323@、com.codenameone.googlemaps.InternalNativeMapsImpl 和 com.codenameone.googlemaps.MapContainer) 以及它们所依赖的代号本机接口类 (com.codename1.system.NativeInterface、com.codename1.impl.android.LifecycleListener...)。而且我对它们进行了反编译并且代码是正确的(无论如何我都不使用任何混淆方法,因此编译的代码与源代码不同并没有真正的原因)。我在这里可能缺少一些东西来使用 cn1lib 进行本地代号构建。
那么,是否有人已经成功地使用执行本地绑定的 cn1lib 进行本地构建?如果是,具体程序是什么? 我真的希望有人能够提供帮助,因为在这一点上,我正在认真考虑坚持使用 react-native(我对此非常满意,除了它不是完全原生的事实)或跳入颤动(或 kotlin 本机),即使我仍然认为 codenameone 提供了许多优于其他解决方案的优势(但在开发阶段无法执行本地构建对我来说是完全不行的)
【问题讨论】:
标签: android build native codenameone lib