如何将Objective-C静态库绑定到Xamarin.iOS?

时间:2016-04-20 04:01:21

标签: c# ios objective-c binding xamarin.ios

我已阅读Xamarin的文档。

这是我在Objective-C中的测试类:

#import "XamarinBundleLib.h"

@implementation XamarinBundleLib

+(NSString *)testBinding{
    return @"Hello Binding";
}
@end

这很容易,只有一种方法。

这是我的C#课程:

namespace ResloveName
{
    [BaseType (typeof (NSObject))]
    public partial interface IXamarinBundleLib {
        [Static,Export ("testBinding")]
        NSString TestBinding {get;}
    }
}

然后这是我的AppDelegate代码:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            // Override point for customization after application launch.
            // If not required for your application you can safely delete this method

            string testStr = ResloveName.IXamarinBundleLib.TestBinding.ToString ();
            System.Console.WriteLine ("testStr="+testStr);

            return true;
        }

当我运行应用程序时,我得到以下异常: enter image description here

TestBinding属性为null。 我在某处肯定是错的,所以我该如何解决?

1 个答案:

答案 0 :(得分:3)

我写了一篇非常详细的博客文章,关于去年从ObjC代码创建一个静态库,它适用于Xamarin.iOS绑定项目,你可以找到它here(以防万一:wink :: wink :)。

如果您手中已经有一个胖静态库,并且已经添加到您的Xamarin.iOS绑定项目中,如上所示:

binding image

问题可能是您的libxyz.linkwith.cs缺少某些信息,如果它看起来像这样:

using ObjCRuntime;
[assembly: LinkWith ("libFoo.a", SmartLink = true, ForceLoad = true)]

它肯定缺少有关胖库支持的体系结构的一些重要信息(缺少第二个参数target),您可以使用以下命令检索当前静态库支持的体系结构

xcrun -sdk iphoneos lipo -info path/to/your/libFoo.a

你应该得到像这样的输出

Architectures in the fat file: Foo/libFoo.a are: i386 armv7 x86_64 arm64

所以我们知道这个静态库支持i386 armv7 x86_64 arm64,我们应该通过提供第二个参数LinkWith来提供我们的target属性支持的arch,如下所示:

using ObjCRuntime;
[assembly: LinkWith ("libFoo.a", LinkTarget.ArmV7 | LinkTarget.Arm64 | LinkTarget.Simulator | LinkTarget.Simulator64, SmartLink = true, ForceLoad = true)]

还要确保LinkWith属性的第一个参数与静态库文件名匹配(在我的例子中为“libFoo.a”)。

我建议仔细检查的另一件事是,静态库的Build Action(在我的情况下为libFoo.a)正确设置为ObjcBindingNativeLibrary,如下所示:

binding image

希望这有帮助!