使用 Xamarin 链接 ObjC 库的问题
Issues Linking ObjC Library using Xamarin
过去几天我一直在努力绑定我的第一个 ObjC 库 (SVGKit)。我已经完成了所有的构建和编译工作,但是当被另一个项目引用时我无法获取它 运行ning。
我的绑定代码可以在这里找到:https://github.com/jamesmundy/SVGKit.Xamarin
当运行时,显示如下错误:
Could not create an native instance of the type
'SVGKitBindings.SVGKImageView': the native class hasn't been loaded.
It is possible to ignore this condition by setting
ObjCRuntime.Class.ThrowOnInitFailure to false.
我检查了我正在使用的静态库,它支持以下平台:
Architectures in the fat file: libSVGKit-iOS.1.2.0.a are: 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)]
我也在所有模拟器上尝试了代码,但不幸的是还是没有成功。
[assembly: LinkWith ("libSVGKit-iOS.1.2.0.a", LinkTarget.ArmV7 | LinkTarget.Simulator, SmartLink = true, ForceLoad = true)]
这可能不是您的(唯一)问题,但它是不正确的。您的 LinkTarget
应该与静态库支持的体系结构相匹配。 IOW 你缺少 Arm64
和 Simulator64
.
也尝试在不同的模拟器(32 位,如 iPhone 4S,和 64 位,如 iPhone 5S)或设备(同样是 32 位与 64 位)上执行你的应用程序。这将告诉您它是一般问题还是特定于体系结构的问题(并且您应该使用这些额外的信息来更新您的问题)。
在发现我的代码和项目存在一些问题后,我能够解决这个问题。
Linker.cs 文件实际上并未与项目一起构建。虽然它在解决方案中,但它没有被编译,因此它包含的 link 库的重要信息一起丢失了。
SVGKit 使用了多个框架。我没有在 linker 文件中引用这些,还需要一些其他 linkerflags。当我解决了这个问题后,文件看起来像这样:
[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)]
过去几天我一直在努力绑定我的第一个 ObjC 库 (SVGKit)。我已经完成了所有的构建和编译工作,但是当被另一个项目引用时我无法获取它 运行ning。
我的绑定代码可以在这里找到:https://github.com/jamesmundy/SVGKit.Xamarin
当运行时,显示如下错误:
Could not create an native instance of the type 'SVGKitBindings.SVGKImageView': the native class hasn't been loaded. It is possible to ignore this condition by setting ObjCRuntime.Class.ThrowOnInitFailure to false.
我检查了我正在使用的静态库,它支持以下平台:
Architectures in the fat file: libSVGKit-iOS.1.2.0.a are: 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)]
我也在所有模拟器上尝试了代码,但不幸的是还是没有成功。
[assembly: LinkWith ("libSVGKit-iOS.1.2.0.a", LinkTarget.ArmV7 | LinkTarget.Simulator, SmartLink = true, ForceLoad = true)]
这可能不是您的(唯一)问题,但它是不正确的。您的 LinkTarget
应该与静态库支持的体系结构相匹配。 IOW 你缺少 Arm64
和 Simulator64
.
也尝试在不同的模拟器(32 位,如 iPhone 4S,和 64 位,如 iPhone 5S)或设备(同样是 32 位与 64 位)上执行你的应用程序。这将告诉您它是一般问题还是特定于体系结构的问题(并且您应该使用这些额外的信息来更新您的问题)。
在发现我的代码和项目存在一些问题后,我能够解决这个问题。
Linker.cs 文件实际上并未与项目一起构建。虽然它在解决方案中,但它没有被编译,因此它包含的 link 库的重要信息一起丢失了。
SVGKit 使用了多个框架。我没有在 linker 文件中引用这些,还需要一些其他 linkerflags。当我解决了这个问题后,文件看起来像这样:
[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)]