2016-04-20 5 views
2

私はXamarinからドキュメントを読みました。Objective-C静的ライブラリをXamarin.iOSにバインドする方法は?

そして、これは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; 
     } 

私はアプリケーションを実行すると、私はこの例外を取得: enter image description here

TestBinding属性がnullです。 どこか間違っている必要がありますので、どうすれば修正できますか?

+0

Objective Sharpieを試しましたか? https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/ – iamIcarus

+0

「NSString」ではなく「string」を使用してバインドを試してください。それがうまくいかない場合は、何らかの理由でネイティブライブラリが実行可能ファイルにリンクされていない可能性があります(ビルドログにはこれが表示されます)。 –

+0

NSStringの代わりにstringを使用しようとしましたが、それは正しくありません。今では私のネイティブライブラリで何かが間違っていると思うかもしれません。私はそれをチェックします。ありがとうご提案ありがとうございます。 –

答えて

2

昨年、ObjCコードから静的ライブラリを作成してXamarin.iOSバインディングプロジェクトで動作することについての非常に詳細なブログ記事を投稿しました。それはhere(ちょうどの場合:wink :: wink :)です。

binding image

は問題があなたのlibxyz.linkwith.csているかもしれません:あなたはすでにあなたの手の中に脂肪静的ライブラリを持っており、ここに示したように、それは既にプロジェクトをバインドあなたのXamarin.iOSに追加された場合には言われていること

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をサポートしており、次のように2番目の引数targetを提供することによって、LinkWith属性にサポートされているアーチを提供する必要があります。

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

また、LinkWith属性の最初のパラメータが静的ライブラリファイル名(私の場合はlibFoo.a)と一致することを確認してください。


私は二重のチェックをお勧めします他の事はあなたの静的ライブラリ(私の場合はlibFoo.a)のBuild Actionが正しくここにショーとしてObjcBindingNativeLibraryに設定されていることである。

binding image

は、この情報がお役に立てば幸いです!

+0

あまりにも遅れて申し訳ありません。とても助かりました。ありがとうございます。 –

+0

あなたの問題を解決した場合、これを答えとしてマークすることができます:)それはあなたを助けてくれてうれしいです – dalexsoto

関連する問題