一. 用户手册
Building an Application with a Native Plugin for iOS
为iOS创建一个带有本地插件的应用程序
用户手册里给出了一种简单的C#调用iOS C++本地插件的方式,概括步骤如下:
- C#脚本中声明外部函数并调用
- 导出Xcode工程
- Xcode工程中新建.mm或者.cpp文件,实现函数
二. 示例
一个简单的例子:界面上有一个button,每点击一次,button上的数字+1
- Unity3D C#脚本中声明外部函数Add
using System.Runtime.InteropServices;
[DllImport ("__Internal")]
private static extern int Add(int x); //返回x+1
- C#调用Add,并修改button上的text.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using UnityEngine.UI;
public class ButtonControl : MonoBehaviour {
public Text text;
int cnt = 0;
[DllImport ("__Internal")]
private static extern int Add(int x);
public void ButtonClick(){
cnt = Add (cnt);
text.text = "" + cnt;
}
}
-
导出Xcode工程,新建.mm(或.cpp)文件
汇编后的C#代码和C++代码是在link阶段被链接到一起的。C++代码不需要.h头文件。
代码要放在Classes
目录下。修改Unity项目,以append
方式导出、更新Xcode工程时,该文件夹不会被覆盖。
编写Add.mm,C++实现函数
提供给C#调用的C++接口需加上extern "c"
(按C语言进行编译),否则会link失败。
extern "C"{
int Add(int x){
return x+1;
}
};
- build工程,下载测试
三. 参数传递
关于C#和C++数据类型的对应关系我也没有仔细研究过,不过网上资料应该挺多的。
我自己用到的有int
、double
、float
,这几个基础类型C#和C++是一样的。
数组类型参数传递方式:
C#声明与调用
[DllImport("__Internal")]
private static extern bool PF(double[] p);
double[] params = new double[6];
if (!PF (params)) {
};
C++实现
bool PF(double* params){
//……
return true;
}