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