Unity在Android和iOS中如何调用Native API (1)
16lz
2022-01-17
本文主要是对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 接口的引用声明是不一样的。本例对应的接口声明如下:
- publicclassCallNativeAPI{
- #ifUNITY_EDITOR
- publicstaticvoidOpenWebView(stringurl){
- return;
- }
- publicstaticvoidSumNum(intv1,intv2){
- TestUnityEditor.SumNum(v1,v2);
- return;
- }
- #elifUNITY_IPHONE
- [DllImport("__Internal")]
- publicstaticexternvoidOpenWebView(stringurl);
- [DllImport("__Internal")]
- publicstaticexternvoidSumNum(intv1,intv2);
- #elifUNITY_ANDROID
- [DllImport("libtestunity",CallingConvention=CallingConvention.Cdecl)]
- publicstaticexternvoidOpenWebView(stringurl);
- [DllImport("libtestunity",CallingConvention=CallingConvention.Cdecl)]
- publicstaticexternvoidSumNum(intv1,intv2);
- #endif
- publicstaticvoidSumNumForResult(intv1,intv2,CallbackManager.ResultCallbackcallback){
- TestCallbackManager.sumNumCallback.SetResultCallBack(newCallbackManager.ResultCallback(callback));
- SumNum(v1,v2);
- return;
- }
- }
- namespaceCallbackManager
- {
- publicdelegatevoidResultCallback(intresult);
- publicclassSumNumManager{
- publicSumNumManager()
- {
- }
- privateResultCallbackresultCallback;
- publicvoidSetResultCallBack(ResultCallbackcallback)
- {
- resultCallback=callback;
- }
- publicvoidSendResult(intresult)
- {
- resultCallback(result);
- }
- }
- }
- publicclassTestCallbackManager{
- publicstaticCallbackManager.SumNumManagersumNumCallback=newCallbackManager.SumNumManager();
- }
1. 如何打开webview
由于从C#调用C++的接口,需要在C++层分别给出相应的接口实现,如下所示:
★ Android 平台
- extern"C"{
- voidOpenWebView(constchar*url){
- __android_log_print(ANDROID_LOG_INFO,"TestUnity","START;invokingOpenWebView()=%s",url);
- JNIEnv*env=getJNIEnv();
- initJni(env);
- jmethodIDmid=env->GetStaticMethodID(jniClass,"OpenWebView","(Ljava/lang/String;)V");
- if(env->ExceptionCheck()){
- env->ExceptionDescribe();
- }
- jstringopenUrl=(env)->NewStringUTF(url);
- env->CallStaticVoidMethod(jniClass,mid,openUrl);
- if(env->ExceptionCheck()){
- env->ExceptionDescribe();
- }
- __android_log_print(ANDROID_LOG_INFO,"TestUnity","END;invokingOpenWebView()");
- return;
- }
- }
★ iOS平台
- #ifdef__cplusplus
- extern"C"{
- #endif
- voidOpenWebView(constchar*url){
- std::stringwebUrl(url);
- WebviewController::getInstance()->loadURL(webUrl).show();
- return;
- }
- #ifdef__cplusplus
- }
- #endif
本例运行时的截图如下所示:
更多相关文章
- android java 分享功能实现,Cocos2d-x3.3RC0通过JNI调用Android
- Android应用程序的开发
- Android源码分析之WindowManager.LayoutParams属性更新过程
- Android音视频处理技术 视频录制
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
- Android调用系统相机、自定义相机、处理大图片
- Mika Mobile 谈论 Android(安卓)游戏开发:一个吵闹而让人讨厌的孩
- Android屏幕锁定实例源码详解教程一
- 个人开发者如何通过Android应用赚外快[推荐给想赚外快的同学]