【问题标题】:How to bind an Objective-C static library to Xamarin.iOS?如何将 Objective-C 静态库绑定到 Xamarin.iOS?
【发布时间】:2016-04-20 04:01:20
【问题描述】:

我已阅读 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;
        }

当我运行应用程序时,我得到了这个异常:

TestBinding 属性为空。 我一定是哪里出错了,我该如何解决呢?

【问题讨论】:

  • 尝试使用string而不是NSString进行绑定。如果这不起作用,很可能是本机库由于某种原因没有链接到可执行文件(构建日志会显示这一点)。
  • 我尝试使用字符串而不是 NSString,但这也不对。现在我想我的原生库也可能有问题,我会检查一下。谢谢你的建议。

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


【解决方案1】:

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

也就是说,如果您已经拥有一个胖静态库并且它已经添加到您的 Xamarin.iOS 绑定项目中,如下所示:

问题可能是您的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,我们应该通过提供第二个参数target 来提供我们的LinkWith 属性支持的拱门,如下所示:

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,如下所示:

希望这会有所帮助!

【讨论】:

  • 很抱歉回答得太晚了。很有帮助,谢谢。
  • 如果它解决了您的问题,您可以将其标记为答案 :) 很高兴它对您有所帮助
  • @dalexsoto 您的博文似乎离线了,我可以在其他地方找到吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2016-08-13
  • 2020-03-05
  • 2015-10-23
  • 1970-01-01
  • 2016-08-21
  • 2014-06-21
相关资源
最近更新 更多