[Unity]:iOSシミュレータでネイティブプラグインを動かす

UnityからiOSビルドをする時に、「PlayerSettings」-「Other Settings」-「Optimization」-「SDK Version」をデフォルトの「Device SDK」から「Simulator SDK」に変更する事により、iOS Simulator用のXcodeプロジェクトを吐き出し、iOS Simulator上で動作を確認することができます。

ただUnityのiOS Simulator向けビルドはネイティブプラグインの呼び出しをサポートしておらず、ネイティブプラグイン呼び出し時に以下ようなのエラーを吐いて、動作しません。

EntryPointNotFoundException: initAdBanner_
  at (wrapper managed-to-native) Binding:initAdBanner_ (string)
  at Binding.initAdBanner () [0x00000] in <filename unknown>:0

このエラーを回避し、ネイティブプラグインをシミュレータ上で動作させる方法がこちらのサイトで紹介されていました。

「Jason Lu Game Programmer –
Unity4: Test Unity iOS plug-in on iOS simulator」

画像付きですし分かり易いと思いますが、日本語で分かり易く紹介しておきます。
Unityのバージョンは4.5.5f1で試しています。

変更はUnityからiOS Simulatorビルドで吐き出されたXcodeプロジェクトの以下のソース中の2カ所に対して行います。

 Librariesフォルダ – RegisterMonoModules.cpp

1.mono_dl_register_symbolの宣言を#ifディレクティブの外に出します。

extern "C"
{
	typedef void* gpointer;
	typedef int gboolean;
#if !(TARGET_IPHONE_SIMULATOR)
	const char*			UnityIPhoneRuntimeVersion = "4.5.5f1";
	void				mono_dl_register_symbol (const char* name, void *addr);
	extern int 			mono_ficall_flag;
	void				mono_aot_register_module(gpointer *aot_info);
	extern gboolean		mono_aot_only;
	extern gpointer*	mono_aot_module_Assembly_CSharp_firstpass_info; // Assembly-CSharp-firstpass.dll
	extern gpointer*	mono_aot_module_Assembly_CSharp_info; // Assembly-CSharp.dll
	extern gpointer*	mono_aot_module_Assembly_UnityScript_info; // Assembly-UnityScript.dll
	extern gpointer*	mono_aot_module_Boo_Lang_info; // Boo.Lang.dll
	extern gpointer*	mono_aot_module_Mono_Security_info; // Mono.Security.dll
	extern gpointer*	mono_aot_module_PlayMaker_info; // PlayMaker.dll
	extern gpointer*	mono_aot_module_System_Core_info; // System.Core.dll
	extern gpointer*	mono_aot_module_System_info; // System.dll
	extern gpointer*	mono_aot_module_UnityEngine_info; // UnityEngine.dll
	extern gpointer*	mono_aot_module_UnityScript_Lang_info; // UnityScript.Lang.dll
	extern gpointer*	mono_aot_module_mscorlib_info; // mscorlib.dll
#endif // !(TARGET_IPHONE_SIMULATOR)
	void	initAdBanner_();
	void	moveOffBanners_();
	void	share_();
	void	shareWithImage_();
	void	showAppStore_();
	void	UnityNSObject_RetainObject();
	void	UnityNSObject_ReleaseObject();
	void	UnityNSError_Code();
	void	UnityNSError_Description();
	void	UnityNSError_Reason();
	void	UnityNSNotification_Name();
}
extern "C"
{
	typedef void* gpointer;
	typedef int gboolean;
#if !(TARGET_IPHONE_SIMULATOR)
	const char*			UnityIPhoneRuntimeVersion = "4.5.5f1";
	extern int 			mono_ficall_flag;
	void				mono_aot_register_module(gpointer *aot_info);
	extern gboolean		mono_aot_only;
	extern gpointer*	mono_aot_module_Assembly_CSharp_firstpass_info; // Assembly-CSharp-firstpass.dll
	extern gpointer*	mono_aot_module_Assembly_CSharp_info; // Assembly-CSharp.dll
	extern gpointer*	mono_aot_module_Assembly_UnityScript_info; // Assembly-UnityScript.dll
	extern gpointer*	mono_aot_module_Boo_Lang_info; // Boo.Lang.dll
	extern gpointer*	mono_aot_module_Mono_Security_info; // Mono.Security.dll
	extern gpointer*	mono_aot_module_PlayMaker_info; // PlayMaker.dll
	extern gpointer*	mono_aot_module_System_Core_info; // System.Core.dll
	extern gpointer*	mono_aot_module_System_info; // System.dll
	extern gpointer*	mono_aot_module_UnityEngine_info; // UnityEngine.dll
	extern gpointer*	mono_aot_module_UnityScript_Lang_info; // UnityScript.Lang.dll
	extern gpointer*	mono_aot_module_mscorlib_info; // mscorlib.dll
#endif // !(TARGET_IPHONE_SIMULATOR)
	void	mono_dl_register_symbol (const char* name, void *addr);
	void	initAdBanner_();
	void	moveOffBanners_();
	void	share_();
	void	shareWithImage_();
	void	showAppStore_();
	void	UnityNSObject_RetainObject();
	void	UnityNSObject_ReleaseObject();
	void	UnityNSError_Code();
	void	UnityNSError_Description();
	void	UnityNSError_Reason();
	void	UnityNSNotification_Name();
}

2.RegisterMonoModules()中のネイティブ呼び出しするメソッドの定義を#ifディレクティブから外す

void RegisterMonoModules()
{
    gEnableGyroscope = false;
#if !(TARGET_IPHONE_SIMULATOR)
	mono_aot_only = true;
	mono_ficall_flag = true;
	mono_aot_register_module(mono_aot_module_Assembly_CSharp_firstpass_info);
	mono_aot_register_module(mono_aot_module_Assembly_CSharp_info);
	mono_aot_register_module(mono_aot_module_Assembly_UnityScript_info);
	mono_aot_register_module(mono_aot_module_Boo_Lang_info);
	mono_aot_register_module(mono_aot_module_Mono_Security_info);
	mono_aot_register_module(mono_aot_module_PlayMaker_info);
	mono_aot_register_module(mono_aot_module_System_Core_info);
	mono_aot_register_module(mono_aot_module_System_info);
	mono_aot_register_module(mono_aot_module_UnityEngine_info);
	mono_aot_register_module(mono_aot_module_UnityScript_Lang_info);
	mono_aot_register_module(mono_aot_module_mscorlib_info);

	mono_dl_register_symbol("initAdBanner_", (void*)&initAdBanner_);
	mono_dl_register_symbol("moveOffBanners_", (void*)&moveOffBanners_);
	mono_dl_register_symbol("share_", (void*)&share_);
	mono_dl_register_symbol("shareWithImage_", (void*)&shareWithImage_);
	mono_dl_register_symbol("showAppStore_", (void*)&showAppStore_);
	mono_dl_register_symbol("UnityNSObject_RetainObject", (void*)&UnityNSObject_RetainObject);
	mono_dl_register_symbol("UnityNSObject_ReleaseObject", (void*)&UnityNSObject_ReleaseObject);
	mono_dl_register_symbol("UnityNSError_Code", (void*)&UnityNSError_Code);
	mono_dl_register_symbol("UnityNSError_Description", (void*)&UnityNSError_Description);
	mono_dl_register_symbol("UnityNSError_Reason", (void*)&UnityNSError_Reason);
	mono_dl_register_symbol("UnityNSNotification_Name", (void*)&UnityNSNotification_Name);
#endif // !(TARGET_IPHONE_SIMULATOR)
}
void RegisterMonoModules()
{
    gEnableGyroscope = false;
#if !(TARGET_IPHONE_SIMULATOR)
	mono_aot_only = true;
	mono_ficall_flag = true;
	mono_aot_register_module(mono_aot_module_Assembly_CSharp_firstpass_info);
	mono_aot_register_module(mono_aot_module_Assembly_CSharp_info);
	mono_aot_register_module(mono_aot_module_Assembly_UnityScript_info);
	mono_aot_register_module(mono_aot_module_Boo_Lang_info);
	mono_aot_register_module(mono_aot_module_Mono_Security_info);
	mono_aot_register_module(mono_aot_module_PlayMaker_info);
	mono_aot_register_module(mono_aot_module_System_Core_info);
	mono_aot_register_module(mono_aot_module_System_info);
	mono_aot_register_module(mono_aot_module_UnityEngine_info);
	mono_aot_register_module(mono_aot_module_UnityScript_Lang_info);
	mono_aot_register_module(mono_aot_module_mscorlib_info);
#endif // !(TARGET_IPHONE_SIMULATOR)

	mono_dl_register_symbol("initAdBanner_", (void*)&initAdBanner_);
	mono_dl_register_symbol("moveOffBanners_", (void*)&moveOffBanners_);
	mono_dl_register_symbol("share_", (void*)&share_);
	mono_dl_register_symbol("shareWithImage_", (void*)&shareWithImage_);
	mono_dl_register_symbol("showAppStore_", (void*)&showAppStore_);
	mono_dl_register_symbol("UnityNSObject_RetainObject", (void*)&UnityNSObject_RetainObject);
	mono_dl_register_symbol("UnityNSObject_ReleaseObject", (void*)&UnityNSObject_ReleaseObject);
	mono_dl_register_symbol("UnityNSError_Code", (void*)&UnityNSError_Code);
	mono_dl_register_symbol("UnityNSError_Description", (void*)&UnityNSError_Description);
	mono_dl_register_symbol("UnityNSError_Reason", (void*)&UnityNSError_Reason);
	mono_dl_register_symbol("UnityNSNotification_Name", (void*)&UnityNSNotification_Name);
}

以上の2カ所を修正することにより、ネイティブプラグインがiOSシミュレータ上でも動作するようになります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です