Android AIDL:从Java更改代码到kotlin后,Porject崩溃

这些是我的项目AIDL-Client , AIDL-Server的链接 。 脚步:

  1. 请安装两个。

  2. 然后点击“BIND设备按钮”

  3. IBindDeviceCallback:deviceName:tpd deviceBrand:loop ”打印在客户端项目中

  4. 在AIDL-Server项目中将“AIDLService.java”更改为“AIDLService.kt”,然后安装apk。

  5. 然后点击AIDL-server项目的“BIND Device button”

你会发现崩溃。

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter deviceCertifcate at android.os.Parcel.readException(Parcel.java:1697) at android.os.Parcel.readException(Parcel.java:1646) at com.loop.ILoopService$Stub$Proxy.bindDevice(ILoopService.java:88) at com.client.MainActivity$mServiceConnection$1.onServiceConnected(MainActivity.kt:53) at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1516) at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1544) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6682) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

它看起来像android / kotlin的问题,而不是我的。

任何关于这次崩溃的想法,如何解决它在kotlin?

exception看起来像是来自Android的原因是因为它正在进程之间传递。

在您的客户端代码的MainActivity.kt第53行,您将null传递给bindDevicedeviceCertificate byte[] 。 例外是告诉你,这不能为空。

将服务从Java转换为Kotlin时,默认情况下, deviceCertifcate: ByteArray方法参数视为非null,即deviceCertifcate: ByteArray 。 如果你告诉Kotlin这个参数可以是null,它不会崩溃。 这是通过声明types的? ,即deviceCertifcate: ByteArray?

欲了解更多信息,请参阅关于Null-Safety的Kotlin文档。

在一个普通的Kotlin应用程序中,这甚至不能编译,但是由于这个通过AIDL跨越了进程边界,编译器无法解决这个问题。