使用Xamarin链接ObjC库的问题

时间:2015-01-14 16:35:03

标签: ios mono xamarin.ios xamarin

我过去几天一直致力于绑定我的第一个ObjC库(SVGKit)。我已经完成了所有构建和编译,但是当我被另一个项目引用时,我无法让它运行。

我可以在此处找到我的绑定代码:https://github.com/jamesmundy/SVGKit.Xamarin

运行时,会显示以下错误:

  

无法创建该类型的本机实例   ' SVGKitBindings.SVGKImageView':本机类尚未加载。   可以通过设置忽略此条件   ObjCRuntime.Class.ThrowOnInitFailure为false。

我已经检查了我使用的静态库,它支持以下平台:

  

胖文件中的体系结构:libSVGKit-iOS.1.2.0.a是:armv7 i386   x86_64 arm64

我相信这就是我所需要的。

我的链接器文件如下:

  

[assembly:LinkWith(" libSVGKit-iOS.1.2.0.a",LinkTarget.ArmV7 |   LinkTarget.Simulator,SmartLink = true,ForceLoad = true)]

我是否必须以不同的方式配置我使用此绑定的项目?任何帮助加载本机库的帮助都非常受欢迎。

更新1:感谢您的建议我尝试编辑链接器文件以支持与静态库相同的平台,遗憾的是它并没有解决问题。该文件现在如下:

  

[assembly:LinkWith(" libSVGKit-iOS.1.2.0.a",LinkTarget.ArmV7 |   LinkTarget.Simulator | LinkTarget.Arm64 | LinkTarget.Simulator64,   SmartLink = true,ForceLoad = true)]

我还尝试了所有模拟器上的代码,但遗憾的是还没有运气。

2 个答案:

答案 0 :(得分:1)

[assembly: LinkWith ("libSVGKit-iOS.1.2.0.a", LinkTarget.ArmV7 | LinkTarget.Simulator, SmartLink = true, ForceLoad = true)]

这可能不是您的(唯一)问题,但它不正确。您的LinkTarget应该与静态库支持的体系结构相匹配。如果您遗失Arm64Simulator64

还尝试在不同的模拟器(32位,如iPhone 4S和64位,如iPhone 5S)或设备(32位对64位)上执行应用程序。这将告诉您它是否是一般性或特定于体系结构的问题(并且您应该使用那些额外的信息更新您的问题)。

答案 1 :(得分:1)

在确定了我的代码和项目的一些问题后,我能够解决这个问题。

  • Linker.cs文件实际上并没有与项目一起构建。虽然它在解决方案中没有被编译,但因此缺少将它们链接在一起的重要信息。

  • SVGKit使用了几个框架。我没有在链接器文件中引用这些,并且还需要一些其他的链接标志。当我解决了这个问题时,文件看起来像这样:

  

[assembly:LinkWith(“libSVGKit-iOS.1.2.0.a”,LinkTarget.ArmV7 |   LinkTarget.Simulator | LinkTarget.Arm64 | LinkTarget.Simulator64,     SmartLink = true,Frameworks =“QuartzCore CoreText CoreGraphics   CoreImage UIKit“,LinkerFlags =” - lxml2 -ObjC“,ForceLoad = true)]