Ошибка Unity Scripting armv7

#ios #unity3d

#iOS #unity-игровой движок

Вопрос:

Я пытаюсь написать свой первый скрипт Unity. Это код для файла с именем TestPlugin.cs, который находится в Assets / Plugins:

 using UnityEngine; 
using System.Runtime.InteropServices;

public class TestPlugin : MonoBehaviour 
{
    [DllImport ("__Internal")]
    private static extern int getString ();

    public static void Awake () {
      print (getString ());
    }
} 
  

Это код для двух файлов, которые я импортирую в папку classes сгенерированного проекта xCode:

TestPlugin.h:

 #import <Foundation/Foundation.h>

@interface TestPlugin : NSObject

-(int)getString;

@end
  

TestPlugin.m:

 #import "TestPlugin.h"

@implementation TestPlugin

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (int)getString
{
    return 7;
}

@end
  

Наконец, это файл javascript, который находится внутри папки ресурсов.

TestPluginTest.js:

 function Update () 
{
TestPlugin.Awake ();
}
  

Также, пожалуйста, обратите внимание, что я не обязательно ожидаю, что все это сработает, просто для компиляции на этом этапе (хотя дополнительные указания и подсказки приветствуются)

Ошибка, которую я получаю в xCode при попытке сборки на iPhone (фактическое устройство), заключается в следующем:

Неопределенные символы для архитектуры armv7: «_getString», на которые ссылается: RegisterMonoModules() в RegisterMonoModules.o ld: символ (ы) не найден для архитектуры armv7 collect2: ld вернул 1 статус выхода

«_getString», на который ссылается:

RegisterMonoModules() в RegisterMonoModules.o

ld: символы не найдены для архитектуры armv7

collect2: ld вернул статус выхода 1

Я в тупике! Заранее спасибо!

Ответ №1:

Я думаю, что проблема заключается в интерфейсе Obj-C, потому что компоновщик не знает, как обрабатывать подпись. Когда я подключал самописную библиотеку, я спроектировал интерфейс так, чтобы он содержал только чистый C-код:

интерфейс.h

 #ifdef __cplusplus
    extern "C" {
#endif    
    int getString();        
#ifdef __cplusplus
    }
#endif
  

интерфейс.c:

 int getString() {
    // do something
}
  

Возможно, полезные публикации в блоге:

iPhone и Unity3D: интеграция сторонних статических библиотек в проекты XCode, созданные Unity3D

Встроенные плагины Unity: OS X

Блог умного марсианина — Эксперимент с собственным интерфейсом iPhone и Unity 3 Pro

Комментарии:

1. итак, проблема в том, что это написано на objective c?

2. Это фактически устранило проблему, но проблема в том, что мне действительно нужно написать интерфейс на objective C. Это не рекомендуется?

3. Единство говорит » нет » в соответствии с unity3d.com/support/documentation/Manual/Plugins.html Не поймите меня неправильно: вы, конечно, можете написать код своего плагина на Obj-C, но вам нужен интерфейс-оболочка на обычном C для C # / JS вызова плагина. В моей библиотеке более 50 классов, но один скудный интерфейс C.