[转载]Unity用户手册-Unity与Android、iOS互相调用
C#是以Assembly(汇编集)为一个基本单位组织代码的,dll就是一个assemble,dll之间有加载依赖顺序。dll是windows平台上的动态库,而so是linux平台上的动态库,最后.a是IOS平台的库文件。Windows平台1、外部导入C# dll导入Unity中,放到Assets任意目录下,可以直接使用2、PC平台调用C/C++代码C代码需要使用extern “C”来封装成dll,
·
C#是以Assembly(汇编集)为一个基本单位组织代码的,dll就是一个assemble,dll之间有加载依赖顺序。 dll是windows平台上的动态库,而so是linux平台上的动态库,最后.a是IOS平台的库文件。
Windows平台
1、外部导入C# dll
导入Unity中,放到Assets任意目录下,可以直接使用
2、PC平台调用C/C++代码
-
C 代码需要使用extern “C”来封装成dll,因为Unity默认是使用C语言调用外部接口,会对C 代码进行命名矫正,使用extern “C”避免这个问题。C语言代码(.c文件)可以直接在Unity的C#代码中调用(调用方式同C++代码一样)。
-
将生成的api.dll放到Unity的Assets/Plugins/x86(或x86_64)下
-
在C#代码中,通过[DllImport("api")] public static extern void API(int param); 的形式重新声明接口函数。注意:DllImport后面跟的dll名字不要加上.dll扩展名,否则会提示找不到。
示例:
xx
.
h
extern
"C"
{
#include
"gnugo.h"
}
extern
"C"
int
_DLLExport
Add
(
int
x
,
int
y
)
;
xx
.
cpp
#include
"xx.h"
int
_DLLExport
Add
(
int
x
,
int
y
)
{
return
x
+
y
;
}
导出的库文件为api.dll,在unity中调用:
using
System
.
Runtime
.
InteropServices
;
// 运行时加载动态库
[
DllImport
(
"api"
)
]
public
static
extern
int
Add
(
int
x
,
int
y
)
;
void
Start
(
)
{
int
result
=
Add
(
1
,
2
)
;
// 调用
}
Android平台
1、调用C/C++代码(jni层的so库)
-
C 代码需要使用extern “C”来封装成.so库,因为Unity默认是使用C语言调用外部接口,会对C 代码进行命名矫正,使用extern “C”避免这个问题。C语言代码(.c文件)可以直接在Unity的C#代码中调用(调用方式同C++代码一样)。
-
将生成的api.so放到Unity的Assets/Plugins/Android/libs/armeabi(或armeabi-v7a或x86)下
-
在C#代码中,通过[DllImport("api")] public static extern void API(int param); 的形式重新声明接口函数。注意:DllImport后面跟的名字不要加上.so扩展名,否则会提示找不到。
2、Unity与Java端互相调用
-
在Android Studio 中新建一个Library的工程,包名要跟Unity的包名保持一致,在unity中playersettings下面的otherSetting里的scripting Backend中有Mono和IL2CPP两个选项,对应的就Unity/Editor/Data/PlaybackEngines/AndroidPlayer/Variations下的Mono和IL2CPP文件夹,去里面找到对应需要的classes.jar
-
把classes.jar导入新建的Library工程,创建一个EmptyActivity,继承UnityPlayerActivity。
-
在Android端,可以通过UnityPlayer.UnitySendMessage("Drive", "UnityMethod", str),调用Unity端的方法,UnityMethod为方法名,str为传递的string。
-
在Unity端,可以通过AndroidJavaClass和AndroidJavaObject,调用Android端的方法。
示例:
Unity端:
using
UnityEngine
;
public
class
Unity_Android
:
MonoBehaviour
{
private
AndroidJavaObject
m_AndroidJavaObject
=
null
;
void
Start
(
)
{
AndroidJavaClass
androidJavaClass
=
new
AndroidJavaClass
(
"com.unity3d.player.UnityPlayer"
)
;
m_AndroidJavaObject
=
androidJavaClass
.
GetStatic
<
AndroidJavaObject
>
(
"currentActivity"
)
;
if
(
m_AndroidJavaObject
!=
null
)
{
m_AndroidJavaObject
.
Call
(
"CallUnityMethod"
,
"Hello World"
)
;
}
}
public
void
UnityMethod
(
string
str
)
{
Debug
.
Log
(
"Android: "
+
str
)
;
}
}
Android端:
public
class
MainActivity
extends
UnityPlayerActivity
{
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
)
;
}
public
void
CallUnityMethod
(
String
str
)
{
System
.
out
.
print
(
"Android Call"
)
;
UnityPlayer
.
UnitySendMessage
(
"Drive"
,
"UnityMethod"
,
str
)
;
}
}
iOS平台
1、Unity调用C/C++/object-C代码
-
创建Xcode工程,编译.a库,放到Assets/Plugins/iOS下
-
在C#代码中,使用[DllImport("__Internal")] public static extern void Func();声明
2、在C/C++/object-C中使用C#中的代码
从Unity导出Xcode工程,在Xcode工程中,调用UnitySendMessage("Drive", "UnityMethod", str),调用场景中Drive的GameObject挂载的代码中的UnityMethod方法。
本文经作者同意,转自知乎@鹅厂程序小哥(https://www.zhihu.com/people/tencentboy),原文链接(https://zhuanlan.zhihu.com/p/339380697)
更多推荐
所有评论(0)