[英]Xamarin iOS binding project
I have an Xamarin.iOS application, and I want to reference a binding project so that I can use a .a
file in my project. 我有一个Xamarin.iOS应用程序,我想引用一个绑定项目,以便可以在项目中使用
.a
文件。 But I get this error when I try to build: 但是当我尝试构建时出现此错误:
linker command failed with exit code 1 (use -v to see invocation) /Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/MTOUCH: Error MT5216: Native linking failed for '/Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/obj/iPhone/Debug/device-builds/iphone7.1-11.0.3/mtouch-cache/arm64/libAcrCloudSdkIosBinding.dll.dylib'.
链接器命令失败,退出代码为1(使用-v查看调用)/Users/darius/Mobile-MyApp/Source/MyApp/MyApp.Touch/MTOUCH:错误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”。 Please file a bug report at http://bugzilla.xamarin.com (MT5216) (Touchshop.Touch)
请在http://bugzilla.xamarin.com (MT5216)(Touchshop.Touch)上提交错误报告。
I checked what architectures the .a
file supports with this command line: 我通过以下命令行检查了
.a
文件支持的体系结构:
xcrun -sdk iphoneos lipo -info libACRCloud_IOS_SDK.a
and it outputs: 它输出:
Architectures in the fat file: libACRCloud_IOS_SDK.a are: armv7 i386 x86_64 arm64
I put the .a
in the NativeReferences
folder. 我将
.a
放在NativeReferences
文件夹中。
Here is my ApiDefinition.cs
: 这是我的
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);
}
} }
And Structs.cs
: 和
Structs.cs
:
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
}
}
Here is the source for it, the .a
file can be found there too ( libACRCloud_IOS_SDK.a
). 这是它的来源,也可以在其中找到
.a
文件( libACRCloud_IOS_SDK.a
)。 And Here is the cocoapod for it. 这是它的cocoapod。
After a week of hacking at this, I found the solution. 经过一周的黑客培训,我找到了解决方案。 I opened the source code of the native project (Swift) in Xcode and noticed that it was referencing
libc++.tbd
. 我在Xcode中打开了本机项目(Swift)的源代码,并注意到它引用了
libc++.tbd
。 So all I had to do is set -lc++
in the Linker Flags for the referencing .a
library in Visual Studio (Right click on the library -> Properties -> Linker Flags). 因此,我要做的就是在Visual Studio中引用
.a
库的链接器标志中设置-lc++
(右键单击该库->属性->链接器标志)。
Also, make sure that you are giving the appropriate privileges in your info.plist
that your library needs. 另外,请确保在
info.plist
中为库提供了适当的特权。 It would just crash on me without giving any error before I set the privileges that it needed. 在我设置所需的特权之前,它只会崩溃而不会给出任何错误。
The tool that Cole Xia referenced is worth looking at too, because I had to manually pick out the interfaces I needed in the generated ApiDefinition.cs
because it was filled with junk that I didn't need, and fix a few things with it too. Cole Xia引用的工具也值得一看,因为我不得不手动选择生成的
ApiDefinition.cs
需要的接口,因为它充满了我不需要的垃圾,并且还修复了一些问题。 。 So I gave him the bounty points for that. 因此,我为此给了他赏金积分。 I guess the tool didn't work for this library because of the referencing
libc++.tbd
. 我猜该工具由于引用
libc++.tbd
而不适用于该库。
Try to update Xcode and Sharpie to the latest version, and then recreate the binding project. 尝试将Xcode和Sharpie更新到最新版本,然后重新创建绑定项目。
here may be helpful. 这可能会有所帮助。
I try to use Sharpie with cocoapods following official link . 我尝试在官方链接后将Sharpie与cocoapods一起使用。
When I try to bind famous third-party library like AFNetworking
, it generates a folder named Binding
,inside it we can find the ApiDefinitions
, StructsAndEnums
and the library. 当我尝试绑定著名的第三方库(如
AFNetworking
,它将生成一个名为Binding
的文件夹,在其中我们可以找到ApiDefinitions
, StructsAndEnums
和该库。
sharpie pod -d /Users/yourName/Desktop/FolderName init ios AFNetworking && sharpie pod -d /Users/yourName/Desktop/FolderName bind
When I try to bind acrcloud
, it didn't generate the binding folder. 当我尝试绑定
acrcloud
,它没有生成绑定文件夹。
sharpie pod -d /Users/yourName/Desktop/FolderName init ios acrcloud_ios_sdk && sharpie pod -d /Users/yourName/Desktop/FolderName bind
So I guess there may be something wrong with acrcloud
sdk. 所以我想
acrcloud
sdk可能有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.