Xamarin 绑定“包装器类型”缺少其本机 ObjectiveC 类
Posted
技术标签:
【中文标题】Xamarin 绑定“包装器类型”缺少其本机 ObjectiveC 类【英文标题】:Xamarin Binding "Wrapper type '' is missing its native ObjectiveC Class 【发布时间】:2014-08-10 13:36:43 【问题描述】:我正在尝试将外部附件 MSR SDK 绑定到 Xamarin。请注意,这是在设备上。它在模拟器中根本不起作用。我不断收到此错误:
Wrapper type 'iMagProII.IMag' is missing its native ObjectiveC class 'IMag'.
这是我的 .cs 和我的链接器标志:
[assembly: LinkWith ("libiMagSDK.a", LinkTarget = LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.Simulator, SmartLink = true, ForceLoad = true, IsCxx = true, Frameworks = "CoreGraphics ExternalAccessory", LinkerFlags="-lsqlite3.0 -lc++")]
这是堆栈跟踪:
at MonoTouch.Registrar.DynamicRegistrar.OnRegisterType (MonoTouch.Registrar.ObjCType type) [0x00334] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pmcs-compat.DynamicRegistrar.cs:573
at MonoTouch.Registrar.Registrar.RegisterTypeUnsafe (System.Type type, System.Collections.Generic.List`1& exceptions) [0x009a4] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pmcs-compat.Registrar.cs:1027
at MonoTouch.Registrar.Registrar.RegisterType (System.Type type, System.Collections.Generic.List`1& exceptions) [0x00011] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pmcs-compat.Registrar.cs:680
at MonoTouch.Registrar.DynamicRegistrar.Register (System.Type type) [0x00002] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pmcs-compat.DynamicRegistrar.cs:839
at MonoTouch.ObjCRuntime.Class.Register (System.Type type) [0x00000] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pmcs-compat.Class.cs:126
at MonoTouch.ObjCRuntime.Class.GetHandle (System.Type type) [0x00000] in <filename unknown>:0
at MonoTouch.Foundation.NSObject.AllocIfNeeded () [0x00015] in /Developer/MonoTouch/Source/maccore/src/Foundation/.pmcs-compat.NSObject2.cs:390
at MonoTouch.Foundation.NSObject..ctor (MonoTouch.Foundation.NSObjectFlag x) [0x00006] in /Developer/MonoTouch/Source/maccore/src/Foundation/.pmcs-compat.NSObject2.cs:102
at iMagProII.IMag..ctor () [0x00000] in /Users//Projects/Xamarin/Bindings/Unimag/iMagProII/obj/Debug/ios/iMagProII/IMag.g.cs:112
at iMagProII.iOS.ImagViewController.ViewDidLoad () [0x0005c] in /Users//Projects/Xamarin/Bindings/Unimag/iMagProII.iOS/ImagViewController.cs:46
at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr)
at MonoTouch.UIKit.UIViewController.get_View () [0x00030] in /Developer/MonoTouch/Source/monotouch/src/build/compat/UIKit/.pmcs-compat.UIViewController.g.cs:2232
at iMagProII.iOS.ImagViewController..ctor () [0x00008] in /Users//Projects/Xamarin/Bindings/Unimag/iMagProII.iOS/ImagViewController.cs:23
at iMagProII.iOS.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x00016] in /Users//Projects/Xamarin/Bindings/Unimag/iMagProII.iOS/AppDelegate.cs:33
at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/.pmcs-compat.UIApplication.cs:38
at iMagProII.iOS.Application.Main (System.String[] args) [0x00008] in /Users//Projects/Xamarin/Bindings/Unimag/iMagProII.iOS/Main.cs:17
任何有关绑定此库的帮助将不胜感激。几个小时以来我一直在努力。
【问题讨论】:
【参考方案1】:当在最终的可执行文件中找不到类 IMag
时会发生这种情况。
最常见的原因是:
类名中有错字。本机库不包含您正在构建的架构。例如,本机库需要包含 i386 代码才能在模拟器中运行。您可以使用lipo
工具列出原生库中的架构:
$ lipo -info /path/to/libiMagSDK.a
您还需要了解应用程序所使用的架构,您可以在项目的 iOS 构建设置中的高级页面上进行检查。选择一个原生库包含的。
绑定项目中的本机库依赖于另一个不在绑定项目中的本机库(并且IMag
类在该其他库中)。必须包含所有非平台依赖项。
本机库构建不正确,并且不包含您尝试绑定的类(这种情况并不常见,但我仍然见过几次)。您可以使用nm
工具检查原生库中包含的内容:
$ nm -arch armv7 /path/to/libiMagSDK.a | grep IMag
0x0000f00d S _OBJC_CLASS_$_IMag
[other results]
以上结果表明该类已包含在本机库中。
【讨论】:
这非常有效。我从来没有找到关于如何找出静态库是基于什么架构的好的文档。谢谢!以上是关于Xamarin 绑定“包装器类型”缺少其本机 ObjectiveC 类的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Android Java绑定库运行时失败访问本机库