[Unity IOS] Unity和IOS交互

emmmmm...今天Unity打包的Xcode工程运行崩溃,找了半天才找到原因,自己百度似乎没有太直接的答案,想了想就写了这个文章,也怕自己时间久了忘记。懒人的第一篇,有需要的大家可以look look。

工程崩溃在:

inline void il2cpp_codegen_marshal_free(void* ptr) {

    il2cpp::vm::PlatformInvoke::MarshalFree(ptr);

}

报错:Thread 1: signal SIGABRT


log日志为:

malloc: error for object 0x10124bdda: pointer being freed was not allocated

set a breakpoint in malloc_error_break to debug

经查阅il2cpp_codegen_marshal_free方法是释放内存使用的。


经过问题定位,回到OC被Unity调用的代码中,问题在于交互中参数与返回值。当Unity调用IOS代码并且返回类型为string时。若在oc代码中不给返回的值分配内存空间,则释放该变量的时候就会引起上面的错误。(值类型不需要)


正确的写法:

Unity代码:

using UnityEngine;
using System.Runtime.InteropServices;

namespace newnamespace {

	public class Test : MonoBehaviour {
        
        void Start() {
#if UNITY_IOS && !UNITY_EDITOR
            //执行调用IOS的方法
            string s =UnityCallIOS(1, "UnityCallIOS");
            Debug.Log("wjr-----s:"+s);
#endif
        }
        //生成和IOS交互的方法
        [DllImport("__Internal")]
        static extern string UnityCallIOS(int x, string s);
    }
}


IOS代码:

char* UnityCallIOS(int x, char* s){
    NSLog(@"UnityCallIOS---%d---%s",x,s);
    //strdup 拷贝字符串,分配内存
    return strdup("abc");
}

进过测试,在方法名相同的情况下,在一边有返回值一边没返回值等多数情况,运行都可以通过,例如:

Unity:

[DllImport("__Internal")]
static extern void UnityCallIOS(string s);

IOS:

char* UnityCallIOS(char* s){
    NSLog(@"UnityCallIOS----%s",s);
    return "abc";
}

所以以防万一,两边返回值和参数类型都尽量统一。

你可能感兴趣的:(Unity)