読者です 読者をやめる 読者になる 読者になる

Unity から C++ 側でallocした配列にアクセスする

C++で new し、C#側で一旦コピー、さらにC++で削除

hoge.h
#pragma once

#define DLL_UNITY extern "C" __declspec(dllexport)

typedef unsigned char byte ;

DLL_UNITY void loadData (byte** data, int* dataSize);
DLL_UNITY void freeData (byte** data);
hoge.cpp
#include "hoge.h"

void loadData(byte** data, int* dataSize) {

	int s = 10;
	byte* d = new byte[size];

	// ...

	*data = d;
	*dataSize = s;
}

void freeData(byte** data) {
	delete[] *data;
	*data = 0;
}
MyData.cs
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class MyData {

    [DllImport("libhoge")]
    public static extern void loadData (ref IntPtr data, ref int dataSize);

    public static void loadData (ref byte[] data) {

        IntPtr buff = IntPtr.Zero;
        int buffSize = 0;

        loadData(ref buff, ref buffSize);

        byte[] result = new byte[buffSize];
        // コピーしてから使う
        Marshal.Copy(buff, result, 0, buffSize);

        freeData(ref buff);
    }

    [DllImport("libhoge")]
    public static extern void freeData(ref IntPtr data);
}