Xamarin iOS绑定项目

Xamarin iOS绑定项目,xamarin,xamarin.ios,objective-sharpie,Xamarin,Xamarin.ios,Objective Sharpie,我有一个Xamarin.iOS应用程序,我想引用一个绑定项目,以便在我的项目中使用.a文件。但当我尝试构建时,会出现以下错误: 链接器命令失败,退出代码为1(使用-v查看调用) /Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/MTOUCH:Error MT5216:'/Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/obj/iPhone/Debug/device builds/iphon

我有一个Xamarin.iOS应用程序,我想引用一个绑定项目,以便在我的项目中使用
.a
文件。但当我尝试构建时,会出现以下错误:

链接器命令失败,退出代码为1(使用-v查看调用) /Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/MTOUCH:Error MT5216:'/Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/obj/iPhone/Debug/device builds/iphone7.1-11.0.3/MTOUCH cache/arm64/libAcrCloudSdkIosBinding.dll.dylib'的本机链接失败。请在(MT5216)(Touchshop.Touch)提交错误报告

我用以下命令行检查了
文件支持的体系结构:

xcrun-sdk iphoneos lipo-info libACRCloud\u IOS\u sdk.a

它输出:

fat文件中的架构:libACRCloud\u IOS\u SDK.a是:armv7 i386 x86\u 64 arm64

我把
.a
放在
NativeReferences
文件夹中

这是我的
ApiDefinition.cs

using System;

using UIKit;
using Foundation;
using ObjCRuntime;
using CoreGraphics;

namespace AcrCloudSdkIos
{
// typedef void (^ACRCloudResultBlock)(NSString *, ACRCloudResultType);
delegate void ACRCloudResultBlock(string arg0, ACRCloudResultType arg1);

// typedef void (^ACRCloudResultWithFpBlock)(NSString *, NSData *);
delegate void ACRCloudResultWithFpBlock(string arg0, NSData arg1);

// typedef void (^ACRCloudStateBlock)(NSString *);
delegate void ACRCloudStateBlock(string arg0);

// typedef void (^ACRCloudVolumeBlock)(float);
delegate void ACRCloudVolumeBlock(float arg0);

// @interface ACRCloudConfig : NSObject
[BaseType(typeof(NSObject))]
interface ACRCloudConfig
{
    // @property (retain, nonatomic) NSString * accessKey;
    [Export("accessKey", ArgumentSemantic.Retain)]
    string AccessKey { get; set; }

    // @property (retain, nonatomic) NSString * accessSecret;
    [Export("accessSecret", ArgumentSemantic.Retain)]
    string AccessSecret { get; set; }

    // @property (retain, nonatomic) NSString * host;
    [Export("host", ArgumentSemantic.Retain)]
    string Host { get; set; }

    // @property (retain, nonatomic) NSString * audioType;
    [Export("audioType", ArgumentSemantic.Retain)]
    string AudioType { get; set; }

    // @property (retain, nonatomic) NSString * homedir;
    [Export("homedir", ArgumentSemantic.Retain)]
    string Homedir { get; set; }

    // @property (retain, nonatomic) NSString * uuid;
    [Export("uuid", ArgumentSemantic.Retain)]
    string Uuid { get; set; }

    // @property (retain, nonatomic) NSString * protocol;
    [Export("protocol", ArgumentSemantic.Retain)]
    string Protocol { get; set; }

    // @property (retain, nonatomic) NSDictionary * params;
    [Export("params", ArgumentSemantic.Retain)]
    NSDictionary Params { get; set; }

    // @property (assign, nonatomic) ACRCloudRecMode recMode;
    [Export("recMode", ArgumentSemantic.Assign)]
    ACRCloudRecMode RecMode { get; set; }

    // @property (assign, nonatomic) NSInteger requestTimeout;
    [Export("requestTimeout")]
    nint RequestTimeout { get; set; }

    // @property (assign, nonatomic) NSInteger prerecorderTime;
    [Export("prerecorderTime")]
    nint PrerecorderTime { get; set; }

    // @property (assign, nonatomic) _Bool keepPlaying;
    [Export("keepPlaying")]
    bool KeepPlaying { get; set; }

    // @property (copy, nonatomic) ACRCloudResultBlock resultBlock;
    [Export("resultBlock", ArgumentSemantic.Copy)]
    ACRCloudResultBlock ResultBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudStateBlock stateBlock;
    [Export("stateBlock", ArgumentSemantic.Copy)]
    ACRCloudStateBlock StateBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudVolumeBlock volumeBlock;
    [Export("volumeBlock", ArgumentSemantic.Copy)]
    ACRCloudVolumeBlock VolumeBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudResultWithFpBlock resultFpBlock;
    [Export("resultFpBlock", ArgumentSemantic.Copy)]
    ACRCloudResultWithFpBlock ResultFpBlock { get; set; }
}

// @interface ACRCloudRecognition : NSObject
[BaseType(typeof(NSObject))]
interface ACRCloudRecognition
{
    // -(id)initWithConfig:(ACRCloudConfig *)config;
    [Export("initWithConfig:")]
    IntPtr Constructor(ACRCloudConfig config);

    // -(void)startPreRecord:(NSInteger)recordTime;
    [Export("startPreRecord:")]
    void StartPreRecord(nint recordTime);

    // -(void)stopPreRecord;
    [Export("stopPreRecord")]
    void StopPreRecord();

    // -(void)startRecordRec;
    [Export("startRecordRec")]
    void StartRecordRec();

    // -(void)stopRecordRec;
    [Export("stopRecordRec")]
    void StopRecordRec();

    // -(void)stopRecordAndRec;
    [Export("stopRecordAndRec")]
    void StopRecordAndRec();

    // -(NSString *)recognize:(char *)buffer len:(int)len;
    [Export("recognize:len:")]
    unsafe string Recognize(NSObject buffer, int len);

    // -(NSString *)recognize:(NSData *)pcm_data;
    [Export("recognize:")]
    string Recognize(NSData pcm_data);

    // -(void)recognize_fp:(NSData *)fingerprint resultBlock:(ACRCloudResultBlock)resultBlock;
    [Export("recognize_fp:resultBlock:")]
    void Recognize_fp(NSData fingerprint, ACRCloudResultBlock resultBlock);

    // -(NSString *)recognize_fp:(NSData *)fingerprint;
    [Export("recognize_fp:")]
    string Recognize_fp(NSData fingerprint);

    // +(NSData *)get_fingerprint:(char *)pcm len:(int)len;
    [Static]
    [Export("get_fingerprint:len:")]
    unsafe NSData Get_fingerprint(NSObject pcm, int len);

    // +(NSData *)get_fingerprint:(NSData *)pcm;
    [Static]
    [Export("get_fingerprint:")]
    NSData Get_fingerprint(NSData pcm);

    // +(NSData *)get_fingerprint:(char *)pcm len:(unsigned int)len sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("get_fingerprint:len:sampleRate:nChannel:")]
    unsafe NSData Get_fingerprint(NSObject pcm, uint len, uint sampleRate, short nChannel);

    // +(NSData *)get_fingerprint:(NSData *)pcm sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("get_fingerprint:sampleRate:nChannel:")]
    NSData Get_fingerprint(NSData pcm, uint sampleRate, short nChannel);

    // +(NSData *)resample:(NSData *)pcm sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("resample:sampleRate:nChannel:")]
    NSData Resample(NSData pcm, uint sampleRate, short nChannel);

    // +(NSData *)resample:(char *)pcm len:(unsigned int)len sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("resample:len:sampleRate:nChannel:")]
    unsafe NSData Resample(NSObject pcm, uint len, uint sampleRate, short nChannel);

    // +(NSData *)resample_bit32:(char *)pcm len:(unsigned int)bytes sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel isFloat:(_Bool)isFloat;
    [Static]
    [Export("resample_bit32:len:sampleRate:nChannel:isFloat:")]
    unsafe NSData Resample_bit32(NSObject pcm, uint bytes, uint sampleRate, short nChannel, bool isFloat);
}
using System;

namespace AcrCloudSdkIosBinding
{
    public enum ACRCloudRecMode : uint
    {
        remote = 0,
        local = 1,
        both = 2,
        advance_remote = 3
    }

    public enum ACRCloudResultType
    {
        error = -1,
        none = 0,
        audio = 1,
        live = 2,
        audio_live = 3
    }

    public enum HTTPResumeType
    {
        error = -1,
        resume = 0,
        restart = 1,
        success = 2
    }
}
}

Structs.cs

using System;

using UIKit;
using Foundation;
using ObjCRuntime;
using CoreGraphics;

namespace AcrCloudSdkIos
{
// typedef void (^ACRCloudResultBlock)(NSString *, ACRCloudResultType);
delegate void ACRCloudResultBlock(string arg0, ACRCloudResultType arg1);

// typedef void (^ACRCloudResultWithFpBlock)(NSString *, NSData *);
delegate void ACRCloudResultWithFpBlock(string arg0, NSData arg1);

// typedef void (^ACRCloudStateBlock)(NSString *);
delegate void ACRCloudStateBlock(string arg0);

// typedef void (^ACRCloudVolumeBlock)(float);
delegate void ACRCloudVolumeBlock(float arg0);

// @interface ACRCloudConfig : NSObject
[BaseType(typeof(NSObject))]
interface ACRCloudConfig
{
    // @property (retain, nonatomic) NSString * accessKey;
    [Export("accessKey", ArgumentSemantic.Retain)]
    string AccessKey { get; set; }

    // @property (retain, nonatomic) NSString * accessSecret;
    [Export("accessSecret", ArgumentSemantic.Retain)]
    string AccessSecret { get; set; }

    // @property (retain, nonatomic) NSString * host;
    [Export("host", ArgumentSemantic.Retain)]
    string Host { get; set; }

    // @property (retain, nonatomic) NSString * audioType;
    [Export("audioType", ArgumentSemantic.Retain)]
    string AudioType { get; set; }

    // @property (retain, nonatomic) NSString * homedir;
    [Export("homedir", ArgumentSemantic.Retain)]
    string Homedir { get; set; }

    // @property (retain, nonatomic) NSString * uuid;
    [Export("uuid", ArgumentSemantic.Retain)]
    string Uuid { get; set; }

    // @property (retain, nonatomic) NSString * protocol;
    [Export("protocol", ArgumentSemantic.Retain)]
    string Protocol { get; set; }

    // @property (retain, nonatomic) NSDictionary * params;
    [Export("params", ArgumentSemantic.Retain)]
    NSDictionary Params { get; set; }

    // @property (assign, nonatomic) ACRCloudRecMode recMode;
    [Export("recMode", ArgumentSemantic.Assign)]
    ACRCloudRecMode RecMode { get; set; }

    // @property (assign, nonatomic) NSInteger requestTimeout;
    [Export("requestTimeout")]
    nint RequestTimeout { get; set; }

    // @property (assign, nonatomic) NSInteger prerecorderTime;
    [Export("prerecorderTime")]
    nint PrerecorderTime { get; set; }

    // @property (assign, nonatomic) _Bool keepPlaying;
    [Export("keepPlaying")]
    bool KeepPlaying { get; set; }

    // @property (copy, nonatomic) ACRCloudResultBlock resultBlock;
    [Export("resultBlock", ArgumentSemantic.Copy)]
    ACRCloudResultBlock ResultBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudStateBlock stateBlock;
    [Export("stateBlock", ArgumentSemantic.Copy)]
    ACRCloudStateBlock StateBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudVolumeBlock volumeBlock;
    [Export("volumeBlock", ArgumentSemantic.Copy)]
    ACRCloudVolumeBlock VolumeBlock { get; set; }

    // @property (copy, nonatomic) ACRCloudResultWithFpBlock resultFpBlock;
    [Export("resultFpBlock", ArgumentSemantic.Copy)]
    ACRCloudResultWithFpBlock ResultFpBlock { get; set; }
}

// @interface ACRCloudRecognition : NSObject
[BaseType(typeof(NSObject))]
interface ACRCloudRecognition
{
    // -(id)initWithConfig:(ACRCloudConfig *)config;
    [Export("initWithConfig:")]
    IntPtr Constructor(ACRCloudConfig config);

    // -(void)startPreRecord:(NSInteger)recordTime;
    [Export("startPreRecord:")]
    void StartPreRecord(nint recordTime);

    // -(void)stopPreRecord;
    [Export("stopPreRecord")]
    void StopPreRecord();

    // -(void)startRecordRec;
    [Export("startRecordRec")]
    void StartRecordRec();

    // -(void)stopRecordRec;
    [Export("stopRecordRec")]
    void StopRecordRec();

    // -(void)stopRecordAndRec;
    [Export("stopRecordAndRec")]
    void StopRecordAndRec();

    // -(NSString *)recognize:(char *)buffer len:(int)len;
    [Export("recognize:len:")]
    unsafe string Recognize(NSObject buffer, int len);

    // -(NSString *)recognize:(NSData *)pcm_data;
    [Export("recognize:")]
    string Recognize(NSData pcm_data);

    // -(void)recognize_fp:(NSData *)fingerprint resultBlock:(ACRCloudResultBlock)resultBlock;
    [Export("recognize_fp:resultBlock:")]
    void Recognize_fp(NSData fingerprint, ACRCloudResultBlock resultBlock);

    // -(NSString *)recognize_fp:(NSData *)fingerprint;
    [Export("recognize_fp:")]
    string Recognize_fp(NSData fingerprint);

    // +(NSData *)get_fingerprint:(char *)pcm len:(int)len;
    [Static]
    [Export("get_fingerprint:len:")]
    unsafe NSData Get_fingerprint(NSObject pcm, int len);

    // +(NSData *)get_fingerprint:(NSData *)pcm;
    [Static]
    [Export("get_fingerprint:")]
    NSData Get_fingerprint(NSData pcm);

    // +(NSData *)get_fingerprint:(char *)pcm len:(unsigned int)len sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("get_fingerprint:len:sampleRate:nChannel:")]
    unsafe NSData Get_fingerprint(NSObject pcm, uint len, uint sampleRate, short nChannel);

    // +(NSData *)get_fingerprint:(NSData *)pcm sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("get_fingerprint:sampleRate:nChannel:")]
    NSData Get_fingerprint(NSData pcm, uint sampleRate, short nChannel);

    // +(NSData *)resample:(NSData *)pcm sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("resample:sampleRate:nChannel:")]
    NSData Resample(NSData pcm, uint sampleRate, short nChannel);

    // +(NSData *)resample:(char *)pcm len:(unsigned int)len sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel;
    [Static]
    [Export("resample:len:sampleRate:nChannel:")]
    unsafe NSData Resample(NSObject pcm, uint len, uint sampleRate, short nChannel);

    // +(NSData *)resample_bit32:(char *)pcm len:(unsigned int)bytes sampleRate:(unsigned int)sampleRate nChannel:(short)nChannel isFloat:(_Bool)isFloat;
    [Static]
    [Export("resample_bit32:len:sampleRate:nChannel:isFloat:")]
    unsafe NSData Resample_bit32(NSObject pcm, uint bytes, uint sampleRate, short nChannel, bool isFloat);
}
using System;

namespace AcrCloudSdkIosBinding
{
    public enum ACRCloudRecMode : uint
    {
        remote = 0,
        local = 1,
        both = 2,
        advance_remote = 3
    }

    public enum ACRCloudResultType
    {
        error = -1,
        none = 0,
        audio = 1,
        live = 2,
        audio_live = 3
    }

    public enum HTTPResumeType
    {
        error = -1,
        resume = 0,
        restart = 1,
        success = 2
    }
}
是它的源代码,
.a
文件也可以在那里找到(
libACRCloud\u IOS\u SDK.a
)。
是它的cocoapod。

尝试将Xcode和Sharpie更新到最新版本,然后重新创建绑定项目

可能会有帮助

更新: 我试着用Sharpie和Cocoapod

  • 当我尝试绑定著名的第三方库(如
    AFNetworking
    )时,它会生成一个名为
    Binding
    的文件夹,在其中我们可以找到
    ApiDefinitions
    StructsAndEnums
    和库

    sharpie pod -d /Users/yourName/Desktop/FolderName init ios AFNetworking && sharpie pod -d /Users/yourName/Desktop/FolderName bind
    

  • 当我尝试绑定
    acrcloud
    时,它没有生成绑定文件夹

    sharpie pod -d /Users/yourName/Desktop/FolderName init ios acrcloud_ios_sdk && sharpie pod -d /Users/yourName/Desktop/FolderName bind
    


所以我猜acrcloud可能有问题。

尝试将Xcode和Sharpie更新到最新版本,然后重新创建绑定项目

可能会有帮助

更新: 我试着用Sharpie和Cocoapod

  • 当我尝试绑定著名的第三方库(如
    AFNetworking
    )时,它会生成一个名为
    Binding
    的文件夹,在其中我们可以找到
    ApiDefinitions
    StructsAndEnums
    和库

    sharpie pod -d /Users/yourName/Desktop/FolderName init ios AFNetworking && sharpie pod -d /Users/yourName/Desktop/FolderName bind
    

  • 当我尝试绑定
    acrcloud
    时,它没有生成绑定文件夹

    sharpie pod -d /Users/yourName/Desktop/FolderName init ios acrcloud_ios_sdk && sharpie pod -d /Users/yourName/Desktop/FolderName bind
    


所以我猜,
acrcloud
sdk可能有问题。

经过一周的黑客攻击,我找到了解决方案。我在Xcode中打开了本机项目(Swift)的源代码,发现它引用了
libc++.tbd
。因此,我所要做的就是在Visual Studio中引用
.a
库的链接器标志中设置
-lc++
(右键单击库->属性->链接器标志)

此外,请确保您在
info.plist
中授予了库所需的适当权限。在我设置它所需的特权之前,它会在我身上崩溃,而不会给出任何错误


Cole Xia引用的工具也值得一看,因为我必须在生成的
ApiDefinition.cs
中手动选择我需要的接口,因为它充满了我不需要的垃圾,并用它修复了一些东西。所以我给了他悬赏分。我猜这个工具对这个库不起作用,因为引用了
libc++.tbd

经过一周的黑客攻击,我找到了解决方案。我在Xcode中打开了本机项目(Swift)的源代码,发现它引用了
libc++.tbd
。因此,我所要做的就是在Visual Studio中引用
.a
库的链接器标志中设置
-lc++
(右键单击库->属性->链接器标志)

此外,请确保您在
info.plist
中授予了库所需的适当权限。在我设置它所需的特权之前,它会在我身上崩溃,而不会给出任何错误


Cole Xia引用的工具也值得一看,因为我必须在生成的
ApiDefinition.cs
中手动选择我需要的接口,因为它充满了我不需要的垃圾,并用它修复了一些东西。所以我给了他悬赏分。我猜这个工具不适用于这个库,因为引用了
libc++.tbd

我更新了这两个库,但出现了相同的错误。我的
ApiDefinition.cs
中可能有什么错误需要修复吗?@Darius你介意分享lib文件吗?我会在我身边测试并让你回来。我在帖子末尾添加了一个下载链接。谢谢@Darius试图用我提供的链接中的工具创建绑定项目。我在帖子底部添加了一个指向源代码的链接。我更新了这两个链接,但出现了相同的错误。我的
ApiDefinition.cs
中可能有什么错误需要修复吗?@Darius你介意分享lib文件吗?我会在我身边测试并让你回来。我在帖子末尾添加了一个下载链接。谢谢@Darius尝试使用我提供的链接中的工具创建绑定项目。我在帖子底部添加了一个指向源代码的链接。我使用了您的ApiDefinition.cs和Structs.cs以及libACRCloud_IOS_SDK。一个从CoCoPapods下载的文件。在Release+设备配置中,成功的构建没有任何错误。但是如果您尝试执行
x=new ACRCloudRecognition()
它将无法编译。我在下面发布了解决方案。我使用您的ApiDefinition.cs和Structs.cs以及libACRCloud_IOS_SDK。这是一个从Cocoapods下载的文件。在Release+设备配置中,成功的构建没有任何错误。但是如果您尝试执行
x=new ACRCloudRecognition()
它将无法编译。我在下面发布了解决方案。