Xamarin绑定“包装类型”缺少其原生ObjectiveC类

时间:2023-01-12 18:42:38

I am trying to bind an external accessory MSR SDK to Xamarin. Note, this is ON the device. It does not work in the simulator at all. I keep getting this error:

我正在尝试将外部附件MSR SDK绑定到Xamarin。注意,这是在设备上。它根本不适用于模拟器。我一直收到这个错误:

Wrapper type 'iMagProII.IMag' is missing its native ObjectiveC class 'IMag'.

Here is my .cs with my linker flags:

这是我的.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++")]

Here is the Stack Trace:

这是堆栈跟踪:

 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 

Any help on getting this library bound would be greatly appreciated. I have been banging my head at it for hours now.

任何有关获取此库的帮助将不胜感激。我一直在敲打几个小时。

1 个解决方案

#1


7  

This occurs when the class IMag can't be found in the final executable.

当在最终的可执行文件中找不到类IMag时会发生这种情况。

The most common reasons for this are:

最常见的原因是:

  • A typo in the class name.
  • 类名中的拼写错误。

  • The native library does not include the architecture you're building for. For instance the native library needs to contain i386 code to run in the simulator. You can use the lipo tool to list the architectures in the native library:

    本机库不包括您正在构建的体系结构。例如,本机库需要包含在模拟器中运行的i386代码。您可以使用lipo工具列出本机库中的体系结构:

    $ lipo -info /path/to/libiMagSDK.a
    

    You also need to know the architecture you're using for the app, you can check this in the project's iOS Build settings, on the Advanced page. Select one that the native library includes.

    您还需要了解您正在为应用程序使用的体系结构,您可以在“高级”页面上的项目的iOS Build设置中进行检查。选择本机库包含的一个。

  • The native library in the binding project depends on another native library which is not in the binding project (and the IMag class is in that other library). All non-platform dependencies must be included.

    绑定项目中的本机库依赖于另一个不在绑定项目中的本机库(IMag类位于其他库中)。必须包含所有非平台依赖项。

  • The native library is incorrectly built, and doesn't include the class you're trying to bind (this is not frequent, but I've still seen it several times). You can use the nm tool to check what's included in a native library:

    本机库构建不正确,并且不包括您尝试绑定的类(这不常见,但我仍然多次看到它)。您可以使用nm工具检查本机库中包含的内容:

    $ nm -arch armv7 /path/to/libiMagSDK.a | grep IMag
    0x0000f00d S _OBJC_CLASS_$_IMag
    [other results]
    

    The above result would indicate that the class is included in the native library.

    上面的结果表明该类包含在本机库中。

#1


7  

This occurs when the class IMag can't be found in the final executable.

当在最终的可执行文件中找不到类IMag时会发生这种情况。

The most common reasons for this are:

最常见的原因是:

  • A typo in the class name.
  • 类名中的拼写错误。

  • The native library does not include the architecture you're building for. For instance the native library needs to contain i386 code to run in the simulator. You can use the lipo tool to list the architectures in the native library:

    本机库不包括您正在构建的体系结构。例如,本机库需要包含在模拟器中运行的i386代码。您可以使用lipo工具列出本机库中的体系结构:

    $ lipo -info /path/to/libiMagSDK.a
    

    You also need to know the architecture you're using for the app, you can check this in the project's iOS Build settings, on the Advanced page. Select one that the native library includes.

    您还需要了解您正在为应用程序使用的体系结构,您可以在“高级”页面上的项目的iOS Build设置中进行检查。选择本机库包含的一个。

  • The native library in the binding project depends on another native library which is not in the binding project (and the IMag class is in that other library). All non-platform dependencies must be included.

    绑定项目中的本机库依赖于另一个不在绑定项目中的本机库(IMag类位于其他库中)。必须包含所有非平台依赖项。

  • The native library is incorrectly built, and doesn't include the class you're trying to bind (this is not frequent, but I've still seen it several times). You can use the nm tool to check what's included in a native library:

    本机库构建不正确,并且不包括您尝试绑定的类(这不常见,但我仍然多次看到它)。您可以使用nm工具检查本机库中包含的内容:

    $ nm -arch armv7 /path/to/libiMagSDK.a | grep IMag
    0x0000f00d S _OBJC_CLASS_$_IMag
    [other results]
    

    The above result would indicate that the class is included in the native library.

    上面的结果表明该类包含在本机库中。