用c语言编程和unity,我该如何从Unity3D调用我的C函数

作者在尝试从Unity3D调用C++编写的函数时遇到困难,函数需要处理图像数据并返回结果。已经尝试了使用DllImport进行调用,但遇到了DllNotFoundException。尝试了不同平台的库编译,包括为MacOSx创建的Plugin.bundle,但问题依然存在。作者寻求帮助以解决库加载和跨平台调用的问题。
摘要由CSDN通过智能技术生成

这有点困难,因为我甚至不知道我的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(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

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

#include

#include

#include

#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;

}

结果是一样的:(

编辑!!!! 7月11日

在看到像@ k-gkinis和@ nikola-dimitroff这样的答案后,我明白我必须为不同的环境编译不同的库.

在这种情况下,我为Mac OS x创建了一个Plugin.bundle:

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());

}

但我仍然得到同样的错误!!

我猜这个插件在正确的位置

怎么了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值