2016-04-20 11 views
2

Ich habe die Dokumentation von Xamarin gelesen.Wie bindet man eine statische Objective-C-Bibliothek an Xamarin.iOS?

Und das ist mein Test-Klasse in Objective-C:

#import "XamarinBundleLib.h" 

@implementation XamarinBundleLib 

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

Es ist sehr einfach, nur eine Methode.

Und das ist meine C# Klasse:

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

Dann ist das hier mein AppDelegate Code:

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; 
     } 

Wenn ich die Anwendung ausführen, ich diese Ausnahme erhalten: enter image description here

Die TestBinding-Attribute ist null. Ich muss irgendwo falsch liegen, also wie kann ich es beheben?

+0

Haben Sie Objective Sharpie ausprobiert? https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/ – iamIcarus

+0

Versuchen Sie die Bindung mit 'string' und nicht mit' NSString'. Wenn das nicht funktioniert, ist es wahrscheinlich, dass die native Bibliothek aus irgendeinem Grund nicht in die ausführbare Datei eingebunden wurde (ein Build-Protokoll würde dies anzeigen). –

+0

Ich habe versucht, Zeichenfolge anstelle von NSString zu verwenden, aber das stimmt auch nicht. Jetzt denke ich, dass vielleicht etwas mit meiner eigenen Bibliothek nicht stimmt, ich werde es überprüfen. Danke für deinen Vorschlag. –

Antwort

2

Ich schrieb einen sehr detaillierten Blogbeitrag über das Erstellen einer statischen Bibliothek aus ObjC Code letztes Jahr, die auf Xamarin.iOS bindende Projekte funktioniert und Sie finden es here (nur für den Fall: wink :: zwink :).

Dass gesagt wird, wenn Sie bereits eine Fett statische Bibliothek in den Händen haben, und es ist bereits in Ihrem Xamarin.iOS Binding-Projekt hinzugefügt, wie hier gezeigt:

binding image

Das Problem, dass Ihre libxyz.linkwith.cs sein könnte einige Informationen fehlen, wenn es so aussieht:

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

es definitiv einige wichtige Informationen über die Architekturen von Ihrem Fett-Bibliothek unterstützt fehlt (es fehlt das zweite Argument target), können Sie den folgenden Befehl abrufen, was Ihre aktuellen statischen Bibliothek-Architekturen unterstützt

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

und Sie sollen so etwas wie dies als Ausgang

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

So wissen wir, diese statische Bibliothek erhalten unterstützt i386 armv7 x86_64 arm64 und wir sollten unsere LinkWith Attribut die unterstützten archs bieten durch das zweite Argument target die Bereitstellung folgt:

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

Stellen Sie außerdem sicher, dass der erste Parameter des Attributs LinkWith mit Ihrem statischen Bibliotheksdateinamen übereinstimmt (in meinem Fall "libFoo.a").


Die andere Sache, die ich doppelte Überprüfung vorschlagen würde, ist, dass die Build Action Ihre statischen Bibliothek (libFoo.a in meinem Fall) zu ObjcBindingNativeLibrary als Show richtig hier eingestellt:

binding image

this helps !

+0

Es tut mir leid für die Antwort zu spät. Es ist sehr hilfreich, danke. –

+0

Sie können dies als die Antwort markieren, wenn es Ihr Problem gelöst hat :) froh, dass es Ihnen geholfen hat – dalexsoto

Verwandte Themen