Задать вопрос
50Dreams
@50Dreams

IL2CPP + DLL, можно ли их подружить?

Здравствуйте, с Наступающим всех ;)
Вообщем, проблема такова -> написал нативный плагин под 64х разрядную архитектуру, но он работает только в редакторе или на Mono бэкенде, а на IL2CPP бэкенде, игра вылетает. Убираем функцию импортированную из моей DLL - всё работает как часы.
Экспортирование функций из C++:
#define DllExport __declspec( dllexport )
extern "C" {
	/*...*/
	DllExport int __stdcall Init(const char* modelPath, const char* haarcascadePath) { /*...*/ }
	/*...*/
	DllExport  void __stdcall ProcessImage(Color32** rawdata, Vector3* coords, int w, int h) { /*...*/ }
	/*...*/
	DllExport  void __stdcall Release() { /*...*/ }
}

Импортирование этих функций в C#:
public class WebcamProcessing : MonoBehaviour
{
    /*...*/
    [DllImport("myawesomedll", EntryPoint = "Init", CallingConvention = CallingConvention.StdCall)]
    private static extern int Init(string detectionModelPath, string haarcascadePath);

    [DllImport("myawesomedll", EntryPoint = "ProcessImage", CallingConvention = CallingConvention.StdCall)]
    private static extern void ProcessImage(ref Color32[] rawImage, [In, Out] Vector3[] data, int width, int height);

    [DllImport("myawesomedll", EntryPoint = "Release", CallingConvention = CallingConvention.StdCall)]
    private static extern void Release();

    void Awake()
    {
        /* Инициализация вебки и, не имеющего ничего общего с проблемой, кода */
        int result = Init(GetFilePath("Название файла"), GetFilePath("Название файла"));
        if (result < 0)
        {
            /* Здесь ловим ошибки, если нативная сторона не смогла загрузить файлы */
        }
        else { Debug.Log("Inited - It's Fine!"); StartCoroutine(Processing()); }
    }
    IEnumerator Processing()
    {
        /* Ожидаем конца фрейма для запуска цикла */
        while (!_stop)
        {
            /* Запускаем код ниже каждый второй фрейм */
            _webCamTexture.GetPixels32(_colors);
            ProcessImage(ref _colors, _landmarksData, W, H);
            _texture.SetPixels32(_colors);
            _texture.Apply();
        }
    }
    /*...*/
}

Выдаёт ошибку: SetPixels32 called with invalid number of pixels in the array.
Будто, функция ProcessImage была игнорирована.
И всё же, как подружить IL2CPP и динамическую библиотеку? Заранее спасибо за любую помощь!
EDIT: Игра собирается под Windows, поэтому используются соответствующие с расширением динамические библиотеки (.dll).
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Никак, ваше библиотека не IL-code. Её нужно собирать отдельно под нативную платформу AndroidNDK и XCode соответственно под свои системы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы