好的,我终于制作了一个静态库,但是出了点问题,目前我无法在Emulator上使用它。 :(
我将逐步解释我是如何制作静态库的:
- 我从这个repository 获得了所有源文件。
-
在 Xcode IDE 中,我制作了 Static Library 项目,之后我从存储库到我的项目。
-
通过 Carthage 我已经下载了this framework(正如我所解释的,源文件使用这个框架)并且我在 Build Phases 中添加了新类别 -> 复制文件(我选择了框架)到我的 Static Library 中。并成功构建(在部署目标 10.2)
.
接下来,我制作了 MakeFile 并成功生成了四个 Fat Binary .a 库任何问题。
Xcrun 命令显示:
xcrun -sdk iphoneos lipo -info libOSMapKitAdapter.a
Architectures in the fat file: libOSMapKitAdapter.a are: i386 armv7 x86_64 arm64
结果是:
Parsing 5 header files...
Binding...
[write] ApiDefinitions.cs
[write] StructsAndEnums.cs
Binding Analysis:
Automated binding is complete, but there are a few APIs which have been flagged with [
Verify] attributes. While the entire binding should be audited for best API design
practices, look more closely at APIs with the following Verify attribute hints:
ConstantsInterfaceAssociation (1 instance):
There's no foolproof way to determine with which Objective-C interface an extern
variable declaration may be associated. Instances of these are bound as [Field]
properties in a partial interface into a nearby concrete interface to produce a more
intuitive API, possibly eliminating the 'Constants' interface altogether.
PlatformInvoke (4 instances):
In general P/Invoke bindings are not as correct or complete as Objective-C bindings (
at least currently). You may need to fix up the library name (it defaults to '__
Internal') and return/parameter types manually to conform to C calling conventionsfor
the target platform. You may find you don't even want to expose the C API in your
binding, but if you do, you'll probably also want to relocate the definition to a
more appropriate class and expose a stronger type-safe wrapper. For P/Invoke guidance,
see http://www.mono-project.com/docs/advanced/pinvoke/.
Once you have verified a Verify attribute, you should remove it from the binding source
code. The presence of Verify attributes intentionally cause build failures.
For more information about the Verify attribute hints above, consult the Objective
Sharpie documentation by running 'sharpie docs' or visiting the following URL:
http://xmn.io/sharpie-docs
Submitting usage data to Xamarin...
Submitted - thank you for helping to improve Objective Sharpie!
Done.
ApiDefinition.cs的生成代码如下:
[Static]
[Verify (ConstantsInterfaceAssociation)]
partial interface Constants
{
// extern double OSMapKitAdapterVersionNumber;
[Field ("OSMapKitAdapterVersionNumber", "__Internal")]
double OSMapKitAdapterVersionNumber { get; }
// extern const unsigned char [] OSMapKitAdapterVersionString;
[Field ("OSMapKitAdapterVersionString", "__Internal")]
byte[] OSMapKitAdapterVersionString { get; }
}
// @interface OSTileOverlay : MKTileOverlay
[BaseType (typeof(MKTileOverlay))]
interface OSTileOverlay
{
// @property (assign, nonatomic) BOOL clipOverlay;
[Export ("clipOverlay")]
bool ClipOverlay { get; set; }
// -(instancetype _Nonnull)initWithAPIKey:(NSString * _Nonnull)apiKey product:(OSMapProduct)product __attribute__((objc_designated_initializer));
[Export ("initWithAPIKey:product:")]
[DesignatedInitializer]
IntPtr Constructor (string apiKey, OSMapProduct product);
}
// @interface OSMapViewRegionRestriction : NSObject
[BaseType (typeof(NSObject))]
interface OSMapViewRegionRestriction
{
// @property (readonly, nonatomic) MKCoordinateRegion initialRegion;
[Export ("initialRegion")]
MKCoordinateRegion InitialRegion { get; }
// -(void)updateMapViewRegionIfRequired:(MKMapView * _Nonnull)mapView;
[Export ("updateMapViewRegionIfRequired:")]
void UpdateMapViewRegionIfRequired (MKMapView mapView);
}
// @interface OSMapKitAdapter : NSObject
[BaseType (typeof(NSObject))]
interface OSMapKitAdapter
{
}
Structs.cs:
[Native]
public enum OSMapProduct : nint
{
Road,
Outdoor,
Light,
Night
}
static class CFunctions
{
// extern NSString * NSStringFromOSMapProduct (OSMapProduct product);
[DllImport ("__Internal")]
[Verify (PlatformInvoke)]
static extern NSString NSStringFromOSMapProduct (OSMapProduct product);
// extern CLLocationCoordinate2D OSUpperLeftCorner ();
[DllImport ("__Internal")]
[Verify (PlatformInvoke)]
static extern CLLocationCoordinate2D OSUpperLeftCorner ();
// extern CLLocationCoordinate2D OSLowerRightCorner ();
[DllImport ("__Internal")]
[Verify (PlatformInvoke)]
static extern CLLocationCoordinate2D OSLowerRightCorner ();
// extern MKMapRect OSMapRectForUK ();
[DllImport ("__Internal")]
[Verify (PlatformInvoke)]
static extern MKMapRect OSMapRectForUK ();
}
好的,现在我遇到了编译错误,因为它是 shows on official tutorial of Xamarin bindings,我需要检查 Fields 与 [Verify] 属性,解决问题后需要删除这个 Attribute ,还添加 Protocol 属性等。
ApiDefinition.cs的新版本:
[Static]
//[Verify(ConstantsInterfaceAssociation)]
partial interface Constants
{
// extern double OSMapKitAdapterVersionNumber;
[Field("OSMapKitAdapterVersionNumber", "__Internal")]
double OSMapKitAdapterVersionNumber { get; }
// extern const unsigned char [] OSMapKitAdapterVersionString;
[Field("OSMapKitAdapterVersionString", "__Internal")]
IntPtr OSMapKitAdapterVersionString { get; }
}
// @interface OSTileOverlay : MKTileOverlay
[BaseType(typeof(MKTileOverlay))]
[Protocol]
interface OSTileOverlay
{
// @property (assign, nonatomic) BOOL clipOverlay;
[Export("clipOverlay")]
bool ClipOverlay { get; set; }
// -(instancetype _Nonnull)initWithAPIKey:(NSString * _Nonnull)apiKey product:(OSMapProduct)product __attribute__((objc_designated_initializer));
[Export("initWithAPIKey:product:")]
[DesignatedInitializer]
IntPtr Constructor(string apiKey, OSMapProduct product);
}
// @interface OSMapViewRegionRestriction : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
interface OSMapViewRegionRestriction
{
// @property (readonly, nonatomic) MKCoordinateRegion initialRegion;
[Export("initialRegion")]
MKCoordinateRegion InitialRegion { get; }
// -(void)updateMapViewRegionIfRequired:(MKMapView * _Nonnull)mapView;
[Export("updateMapViewRegionIfRequired:")]
void UpdateMapViewRegionIfRequired(MKMapView mapView);
}
// @interface OSMapKitAdapter : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
interface OSMapKitAdapter
{
}
结构体的新版本:
#if __UNIFIED__
[Native]
public enum OSMapProduct : long
{
Road,
Outdoor,
Light,
Night
}
#endif
static class CFunctions
{
// extern NSString * NSStringFromOSMapProduct (OSMapProduct product);
[DllImport ("__Internal")]
//[Verify (PlatformInvoke)]
static extern NSString NSStringFromOSMapProduct (OSMapProduct product);
// extern CLLocationCoordinate2D OSUpperLeftCorner ();
[DllImport ("__Internal")]
//[Verify (PlatformInvoke)]
static extern CLLocationCoordinate2D OSUpperLeftCorner ();
// extern CLLocationCoordinate2D OSLowerRightCorner ();
[DllImport ("__Internal")]
//[Verify (PlatformInvoke)]
static extern CLLocationCoordinate2D OSLowerRightCorner ();
// extern MKMapRect OSMapRectForUK ();
[DllImport ("__Internal")]
//[Verify (PlatformInvoke)]
static extern MKMapRect OSMapRectForUK ();
}
问题是我遇到了这个错误:
错误 MT5214:本机链接失败,未定义符号:_OSMapKitAdapterVersionNumber。此符号由托管成员 OSTest.Constants.OSMapKitAdapterVersionNumber 引用。请验证是否已引用所有必要的框架并链接本机库。 (MT5214)
错误 MT5214:本机链接失败,未定义符号:_OSMapKitAdapterVersionString。此符号由托管成员 OSTest.Constants.OSMapKitAdapterVersionString 引用。请验证是否已引用所有必要的框架并链接本机库。 (MT5214)
错误 MT5202:本机链接失败。请查看构建日志。 (MT5202)
_Xamarin.Bindings_ 项目的 .csproj 文件看起来如何:
<ItemGroup>
<Reference Include="System" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="OSTransformation.framework.linkwith.cs" />
</ItemGroup>
<ItemGroup>
<ObjcBindingApiDefinition Include="ApiDefinition.cs" />
</ItemGroup>
<ItemGroup>
<ObjcBindingCoreSource Include="Structs.cs" />
</ItemGroup>
<ItemGroup>
<NativeReference Include="OSTransformation.framework">
<IsCxx>False</IsCxx>
<Kind>Framework</Kind>
</NativeReference>
<NativeReference Include="..\..\..\MyPath\OSMapKitAdapter\libOSMapKitAdapter.a">
<Kind>Static</Kind>
<SmartLink>False</SmartLink>
</NativeReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" />
</Project>
它在真实设备上WORKS,但在模拟器上仍然会出现这种奇怪的错误。
更新:
只需确保您在链接器上选择了“仅链接框架 SDK”并作为例外工作!