【问题标题】:No constructor found for ... (System.IntPtr, Android.Runtime.JniHandleOwnership)没有找到...的构造函数 (System.IntPtr, Android.Runtime.JniHandleOwnership)
【发布时间】:2014-12-21 19:25:06
【问题描述】:

在过去的几天里,我开始收到上述错误。
不是在这里和那里,而是无处不在。在我什至不能把这个奇怪的构造函数放进去的地方, 就像下面的调用堆栈。

我在https://stackoverflow.com/a/10603714/106248 中看到了答案,但我相信这不是我的情况。它只是开始在任何地方发生。特别是当我设置断点时。

这是一个例子:

10-26 15:34:58.895 E/mono-rt (13841): [ERROR] FATAL UNHANDLED EXCEPTION: System.NotSupportedException: Unable to activate instance of type Android.Views.View+IOnClickListenerImplementor from native handle 7960001d ---> System.MissingMethodException: No constructor found for Android.Views.View+IOnClickListenerImplementor::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ---> Java.Interop.JavaLocationException: Exception of type 'Java.Interop.JavaLocationException' was thrown.
10-26 15:34:58.895 E/mono-rt (13841): Java.Lang.Error: Exception of type 'Java.Lang.Error' was thrown.
10-26 15:34:58.895 E/mono-rt (13841): 
10-26 15:34:58.895 E/mono-rt (13841):   --- End of managed exception stack trace ---
10-26 15:34:58.895 E/mono-rt (13841): java.lang.Error: Java callstack:
10-26 15:34:58.895 E/mono-rt (13841):   at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
10-26 15:34:58.895 E/mono-rt (13841):   at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
10-26 15:34:58.895 E/mono-rt (13841):   at android.view.View.performClick(View.java:4475)
10-26 15:34:58.895 E/mono-rt (13841):   at android.view.View$PerformClick.run(View.java:18786)
10-26 15:34:58.895 E/mono-rt (13841):   at android.os.Handler.handleCallback(Handler.java:730)
10-26 15:34:58.895 E/mono-rt (13841):   at android.os.Handler.dispatchMessage(Handler.java:92)
10-26 15:34:58.895 E/mono-rt (13841):   at android.os.Looper.loop

【问题讨论】:

  • 找到解决办法了吗?

标签: xamarin xamarin.android


【解决方案1】:

根据我的经验,当您的应用程序运行时从内存中释放对象时,可能会发生这种情况。然后,例如,如果您返回该页面并且需要由 Mono 重新创建对象,则需要指定该构造函数。

John Pryor answer you are referring to 应该是您问题的答案。重要的部分如下:

所以 Mono for Android 创建了一个适当类型的实例...通过 (IntPtr, JniHandleOwnership) 构造函数,并生成错误 如果找不到这个构造函数。

一旦(在这种情况下)TextView 构造函数完成执行, LogTextBox 的 ACW 构造函数将执行,此时 Mono for Android 会“啊哈!我们已经为此创建了一个 C# 实例 Java 实例”,然后将调用适当的构造函数 已经创建的实例。这意味着对于单个实例,两个 构造函数将被执行: (IntPtr, JniHandleOwnership) 构造函数和(稍后)(Context,IAttributeSet,int) 构造函数。

我想成为更好的帮助,但是没有任何代码 sn-p 很难说。尝试查看实现IOnClickListenerImplementor的对象,看看是否可以在侦听器的实现中添加构造函数......祝你好运

【讨论】:

  • 3 年后,我遇到了这个问题。来自 Xamarin 站点的这部分文档提供了帮助 - Premature Dispose() Calls JNI 句柄和相应的 C# 实例之间存在映射。 Java.Lang.Object.Dispose() 打破了这种映射。如果一个 JNI 句柄在映射被破坏后进入托管代码,它看起来像 Java 激活,并且 (IntPtr, JniHandleOwnership) 构造函数将被检查并调用。如果构造函数不存在,则会抛出异常。 developer.xamarin.com/guides/android/under_the_hood/…
  • 仅供参考 - 我也遇到了这个问题,并了解到如果正在寻找这个构造函数,那就是非常错误的。就我而言,我有一个本地副本,它以某种方式覆盖了 IntPtrHandle 的基本版本,如下所示: public IntPtr Handle { get; ...删除该属性允许地图正常工作。感谢@Dibzmania 提供了这么棒的小消息。
  • 您好,有人为此得到了解决方案。 “无法从本机句柄 0x7fd2839f64 (key_handle 0x1189fc) 激活 Xamarin.Forms.Platform.Android.ListViewAdapter 类型的实例。”
  • @PratiusDubey 请在 Xamarin.Forms GitHub 问题跟踪器上打开一个错误
  • 添加缺少的构造函数,帮助我解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多