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

Попробуйте привязку, используя 'string', а не' NSString'. Если это не сработает, скорее всего, родная библиотека по какой-либо причине не была связана с исполняемым файлом (журнал сборки покажет это). –

+0

Я пытаюсь использовать строку вместо NSString, но это неправильно. Теперь я думаю, может быть, что-то не так с моей родной библиотекой тоже, я проверю. Спасибо за предложение. –

ответ

2

Я написал очень подробное сообщение в блоге о создании статической библиотеки из кода ObjC в прошлом году, которая работает над проектами привязки Xamarin.iOS, и вы можете найти его here (на всякий случай: wink :: wink :).

Это, как говорится, если у вас уже есть жирная статическая библиотека в ваших руках, и он уже добавлен в ваш Xamarin.iOS Binding проекта, как показано здесь:

binding image

Проблема может быть, что ваш libxyz.linkwith.cs отсутствует некоторая информация, если она выглядит следующим образом:

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, и мы должны предоставить атрибут LinkWith поддерживаемых дуг, предоставив второй аргумент target следующим образом:

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

Также убедитесь, что первый параметр атрибута LinkWith соответствует вашему имени файла статической библиотеки («libFoo.a» в моем случае).


Другой вещь, которую я хотел бы предложить двойную проверку, что Build Action вашей статической библиотеки (libFoo.a в моем случае) правильно установлен на ObjcBindingNativeLibrary как показано здесь:

binding image

Надеется, что это помогает !

+0

Прошу прощения за ответ слишком поздно. Это очень полезно, спасибо. –

+0

Вы можете отметить это как ответ, если он решит вашу проблему :) рад, что это вам помогло – dalexsoto

Смежные вопросы