Это немного сложно, потому что я даже не знаю, хорошо ли реализован мой 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());
}
но я все еще получаю ту же ошибку !!
Плагин находится в правильном месте, я думаю,
В чем дело?
Как видно Вот, убедитесь, что у вас есть правильные параметры в инспекторе для плагина.
Кроме того, поскольку вы нацелены на 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 идет выше фрагмента, который начинается с частного статического внешнего