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

Unity在Android和iOS中如何调用Native API (1)

2014-11-13 10:41 302 查看
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍。
首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用。利用这一特性,可以扩展unity的功能。例如集成和调用第三方库。同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用。
这里列举以下两个例子。
1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口。
2. 2. 简单的C# -> C++ -> Java/ObjC -> C#的异步回调实现(会在下一期中给出实现)
由于android和iOS平台加载库的方式不同(android为动态加载,iOS为静态加载),在C#中针对不同平台对dll 接口的引用声明是不一样的。本例对应的接口声明如下:

public class CallNativeAPI {

#if UNITY_EDITOR
public static void OpenWebView(string url) {
return;
}

public static void SumNum(int v1, int v2) {
TestUnityEditor.SumNum(v1, v2);

return;
}
#elif UNITY_IPHONE
[DllImport ("__Internal")]
public static extern void OpenWebView(string url);
[DllImport ("__Internal")]
public static extern void SumNum(int v1, int v2);
#elif UNITY_ANDROID
[DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)]
public static extern void OpenWebView(string url);
[DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)]
public static extern void SumNum(int v1, int v2);
#endif

public static void SumNumForResult(int v1, int v2, CallbackManager.ResultCallback callback) {

TestCallbackManager.sumNumCallback.SetResultCallBack(new CallbackManager.ResultCallback(callback));

SumNum(v1, v2);

return;
}
}

namespace CallbackManager
{
public delegate void ResultCallback(int result);

public class SumNumManager{
public SumNumManager()
{
}

private ResultCallback resultCallback;

public void SetResultCallBack(ResultCallback callback)
{
resultCallback = callback;
}

public void SendResult(int result)
{
resultCallback(result);
}
}
}

public class TestCallbackManager {

public static CallbackManager.SumNumManager sumNumCallback = new CallbackManager.SumNumManager();

}


1. 如何打开webview
由于从C#调用C++的接口,需要在C++层分别给出相应的接口实现,如下所示:

★ Android 平台
extern "C" {
void OpenWebView(const char *url){
__android_log_print(ANDROID_LOG_INFO, "TestUnity", "START ; invoking OpenWebView() = %s", url);

JNIEnv *env = getJNIEnv();
initJni(env);

jmethodID mid = env->GetStaticMethodID(jniClass, "OpenWebView", "(Ljava/lang/String;)V");

if (env->ExceptionCheck()) {
env->ExceptionDescribe();
}

jstring openUrl = (env)->NewStringUTF(url);
env->CallStaticVoidMethod(jniClass, mid, openUrl);

if (env->ExceptionCheck()) {
env->ExceptionDescribe();
}

__android_log_print(ANDROID_LOG_INFO, "TestUnity", "END ; invoking OpenWebView()");
return;
}
}


★ iOS平台

#ifdef __cplusplus
extern "C" {
#endif
void OpenWebView(const char* url) {

std::string webUrl(url);
WebviewController::getInstance()->loadURL(webUrl).show();
return;
}
#ifdef __cplusplus
}
#endif

本例运行时的截图如下所示:





本文出自 “Roket的空间” 博客,请务必保留此出处/article/7210606.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: