您的位置:首页 > 移动开发 > Unity3D

unity c#和c++调用

2016-04-27 17:46 399 查看
mac版:

需要把c++文件打包成bundle(xcode->file->new project->framework&library->bundle),把生成文件拷贝至Plugins:



iOS版:

需要把.h文件和.cpp文件复制Plugins-》IOS文件夹下:



以下为c++文件:

pkmac2.h文件:

extern "C" {

    const char* PrintHello ();

    int PrintANumber ();

    int AddTwoIntegers(int,int);

    float AddTwoFloats(float,float);

    const char* Gets(constchar* path);

    //参数为基本指针类型,如int*, float*, char*

    int AddTwoIntegers2(int*,int*);

    //函数指针回调

    typedef char* (*CALLBACK)(constchar*);

    static CALLBACK callback;   //Native层的全局回调指针

    const char* SetCallBackAndRun(CALLBACK cb);

    //参数为结构体

    struct stEvent

    {

        int value;
//基本类型

        char ch; //基本类型

        int number[3];//数组

        char* str;
//字符串

    };

    const char* Fun(stEvent tEvent);

   
//参数为结构体指针

    const char* Fun2(stEvent* ptEvent);

}

pkmac2.cpp文件:

#include "pkmac2.h"

#include <string>

using namespace
std;

const char* PrintHello(){

    return"Hello";

}

int PrintANumber(){

    return 5;

}

int AddTwoIntegers(int a,int b) {

    return a + b;

}

float AddTwoFloats(float a,float b) {

    return a + b;

}

const char* Gets(constchar* path){

    char *c=newchar[20];

    sprintf(c,"%s%s","Gets",path);

    return c;

}

int AddTwoIntegers2(int*a,int*b){

    return (*a)+(*b);

}

const char* SetCallBackAndRun(CALLBACK cb)

{

    callback = cb;//cb相当于C#中的函数地址

    char* cc=callback("SetCallBackAndRun");

    char *c=newchar[30];

    sprintf(c,"%s%s","zcl--",cc);

    return c;

}

const char* Fun(stEvent tEvent){

    char *c=newchar[30];

    sprintf(c,"%i%c%i%i%i%s",tEvent.value,tEvent.ch,tEvent.number[0]

            ,tEvent.number[1],tEvent.number[2],tEvent.str);

    return c;

}

const char* Fun2(stEvent* tEvent){

    char *c=newchar[30];

    sprintf(c,"%i%c%i%i%i%s",tEvent->value,tEvent->ch,tEvent->number[0]

            ,tEvent->number[1],tEvent->number[2],tEvent->str);

    return c;

}

以下为c#文件:

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using AOT;
public class test : MonoBehaviour {
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern int PrintANumber();
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern IntPtr PrintHello();
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern int AddTwoIntegers(int i1,int i2);
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern float AddTwoFloats(float f1,float f2);
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern IntPtr Gets([MarshalAs(UnmanagedType.LPStr)] string path);
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    private static extern int AddTwoIntegers2(ref int i1,ref int i2);

    //传c#函数让c++调用
    public delegate string callbackDelegate(string str);
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    public static extern IntPtr SetCallBackAndRun(callbackDelegate cb);
    [MonoPInvokeCallback(typeof(callbackDelegate))]
    string PrintString(string str)
    {
        Debug.Log( str);
        return str;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct stEvent
    {
        public Int32 value;
        public char ch;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public Int32[] number;
        public string str;
    }
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    public static extern IntPtr Fun(stEvent tEvent);
    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport ("__Internal")]
    #else
    [DllImport ("pkmac2")]
    #endif
    public static extern IntPtr Fun2(ref stEvent ptEvent);

    public Text text;
    // Use this for initialization
    void Start () {
        int a=2,b=3;
        string s1=Marshal.PtrToStringAuto(Gets("askb"));
        string s2=Marshal.PtrToStringAuto(SetCallBackAndRun(PrintString)); 
        stEvent ste;
        ste.value=10;
        ste.ch='z';
        ste.number=new int[3]{1, 2, 3};;
        ste.str="abc";
        string s3=Marshal.PtrToStringAuto(Fun(ste));
        string s4=Marshal.PtrToStringAuto(Fun2(ref ste));

        string tx=PrintANumber()+"\n"+Marshal.PtrToStringAuto (PrintHello())  
            +"\n"+AddTwoIntegers(2,2)+"\n"+AddTwoFloats(2.5F,4F)
            +"\n"+s1+"\n"+s2+"\n"+s3+"\n"+s4+"\n"+AddTwoIntegers2(ref a,ref b);
        text.text=tx;
    }

    // Update is called once per frame
    void Update () {
    
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity c# c++