unity c#和c++调用

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 () {
    
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值