Как мне вызвать мою функцию C ++ из Unity3D

Это немного сложно, потому что я даже не знаю, хорошо ли реализован мой C ++.

Я хочу вызвать функцию из Unity3D, которой я передаю некоторые параметры, такие как float *points и мой C ++ пишет в этом указателе.

Ну, начиная с C ++, я написал:

main_function.cpp это моя основная функция в C ++, которая прекрасно работает, например, как двоичная.

#include "main_function.h"
extern "C" void getPoints (uchar *data, float *points, int rows, int cols, const char *trackername) {
//load detector model
face_tracker tracker = load_ft<face_tracker>(trackername);

//create tracker parameters
face_tracker_params p; p.robust = false;
p.ssize.resize(3);
p.ssize[0] = Size(21,21);
p.ssize[1] = Size(11,11);
p.ssize[2] = Size(5,5);

Mat im = Mat(Size(cols, rows), CV_8U, data);

if(tracker.track(im,p))
tracker.draw(im, points);

}

main_function.h

#include "opencv_hotshots/ft/ft.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>

extern "C" {
void getPoints (uchar *data, float *points, int rows, int cols, const char *trackername);
}

Затем я хочу обернуть мой код C ++ в C #, поэтому я делаю:

AEDwrapper.h

// AEDwrapper.h
#pragma once

#ifdef TESTFUNCDLL_EXPORT
#define TESTFUNCDLL_API __declspec(dllexport)
#else
#define TESTFUNCDLL_API __declspec(dllimport)
#endif

using namespace System;
#include "stdafx.h"#include "C:\Users\Rafael\Desktop\AEDlibrary\main_function.h"extern "C" {
namespace AEDwrapper {

TESTFUNCDLL_API public ref class AED
{
void getPointsAED (uchar *data, float *points, int rows, int cols, const char *trackername);
};
}
}

а также AEDwrapper.cpp

// Archivo DLL principal.
#include "stdafx.h"#include <ctime>
#include <iostream>
#include <chrono>
#include <sys/timeb.h>

#include "AEDwrapper.h"
using namespace std::chrono;

extern "C" {
void AEDwrapper::AED::getPointsAED (uchar *data, float *points, int rows, int cols, const char *trackername){
getPoints(data, points, rows, cols, trackername);
}
}

Я строю это, и это становится в AEDwrapper.dll,

Теперь в Unity3D, в части C (скрипт) я пытаюсь сделать:

[DllImport ("/Assets/plugins/AEDwrapper.dll")]
// or [DllImport ("AEDwrapper")]
private static extern unsafe void getPointsAED (byte* data, float* points, int rows, int cols, sbyte* trackername);
//DECLARA METODO DEL DLL

DllNotFoundException: /Assets/plugins/AEDwrapper.dll

Я знаю, что могу ошибаться на ранних этапах написания своего кода, но вы когда-нибудь делали это раньше ??? Я немного потерян.

Заранее спасибо.

Рафаэль.


РЕДАКТИРОВАТЬ:

Я пробовал с простой функцией (например: int gimmetwo(); в шапке и:

int gimmetwo() {
return 2;
}

и результат тот же 🙁

РЕДАКТИРОВАТЬ !!!! 11 июля

После просмотра ответов, таких как @ k-gkinis и @ nikola-dimitroff, я понял, что мне нужно собирать разные библиотеки для разных сред.

В этом случае я создал Plugin.bundle для Mac OS x с:

Plugin.pch:

extern "C" {
string getmytext();
}

Plugin.cpp

#include "Plugin.pch"string getmytext() {
return "weowoewoeowoew";
}

Я собрал его и импортировал в Unity3D:

[DllImport ("AED")]
private static extern string getmytext ();

static void obtenerPuntos()
{
Debug.Log (getmytext());
}

но я все еще получаю ту же ошибку !!

введите описание изображения здесь

Плагин находится в правильном месте, я думаю,

введите описание изображения здесь

В чем дело?

8

Решение

Как видно Вот, убедитесь, что у вас есть правильные параметры в инспекторе для плагина.

Кроме того, поскольку вы нацелены на iOS, вы должны статически связать плагин, поэтому ваш атрибут импорта должен быть:

[DllImport ("__Internal")]

ты мог бы написать

   #if UNITY_IPHONE || UNITY_XBOX360

[DllImport ("__Internal")]

#else

[DllImport ("PluginName")]

#endif

Примечание из руководства:

«Нативные плагины iOS можно вызывать только при развертывании на реальном устройстве, поэтому рекомендуется обернуть все методы нативного кода дополнительным слоем кода C #. Этот код должен проверять Application.platform и вызывать нативные методы только тогда, когда приложение работает на устройство; фиктивные значения могут быть возвращены при запуске приложения в редакторе. «

Так:

private static extern string getmytext();

public static string getmytextWrapper()
{
if (Application.platform != RuntimePlatform.OSXEditor)
return getmytext();
else
Debug.Log("Can't call native iOS plugin on other platforms.");
return string.Empty;
}

а затем вызовите getmytextWrapper откуда-нибудь в вашем коде.

(У меня нет xcode, поэтому я не могу вам помочь на IOS)

PS DLLImport идет выше фрагмента, который начинается с частного статического внешнего

3

Другие решения


По вопросам рекламы [email protected]