C# 从不同线程(Android)中的非托管代码调用Unity C委托 我将委托日志记录函数传递给非托管代码,并且它工作正常,除非它是从另一个线程调用的,这是C++库内部的。 我读了,但是我找不到任何信息,当我涉及C++线程时,我应该期待什么。这肯定是线程问题,因为当我从从Unity调用非托管函数的同一线程调用委托时,委托就起作用了
C C++头文件 C++源代码C# 从不同线程(Android)中的非托管代码调用Unity C委托 我将委托日志记录函数传递给非托管代码,并且它工作正常,除非它是从另一个线程调用的,这是C++库内部的。 我读了,但是我找不到任何信息,当我涉及C++线程时,我应该期待什么。这肯定是线程问题,因为当我从从Unity调用非托管函数的同一线程调用委托时,委托就起作用了,c#,android,c++,multithreading,C#,Android,C++,Multithreading,C C++头文件 C++源代码 所以,当定义了“线程启用”时,应用程序会在没有其他信息的情况下自动崩溃。Unity不支持线程,您不能在其他线程中使用它的API 试用 bool res; try{ res = library_init ("someArg1", "someArg2", this.handlerDelegate); }catch (System.Exception e){ Debug.LogError(e.Message); throw; } 来找出你的线有
所以,当定义了“线程启用”时,应用程序会在没有其他信息的情况下自动崩溃。Unity不支持线程,您不能在其他线程中使用它的API 试用
bool res;
try{
res = library_init ("someArg1", "someArg2", this.handlerDelegate);
}catch (System.Exception e){
Debug.LogError(e.Message);
throw;
}
来找出你的线有什么问题
编辑
我不知道我的第一句话对你来说是否属实。我认为Debug.Log应该是安全的。如果是这样的话,你应该调试你的C++线程,看看它为什么崩溃。我找出了这个问题-了解从本地插件调用的回调的特性是有用的。简言之,在托管代码C中,只需要确保委托对象在一段时间内是持久引用的,同时可以从非托管代码调用它。无需担心使用GCHandle固定内存,因为托管运行时环境会自动为委托对象创建一个非托管存根句柄,不管垃圾收集器操作如何,它都会维护其“地址”。此存根句柄在后台传递给非托管函数。Unity不支持线程是什么意思?一般来说,我认为情况并非如此。Unity不允许您从其他线程使用它的API,也就是说,如果您将UnitySAPI中的某些内容放入函数中,并像您一样在委托中使用它,那么从其他线程调用它可能会出错。但就像我在编辑中说的。对你来说,这可能不是问题所在。尝试调试C++代码,看看它为什么崩溃。
extern "C" {
typedef void (*LibLog) (int a);
bool library_init(const char* arg1, const char* arg3, LibLog libLog);
}
static boost::asio::io_service IoService;
static boost::thread aThread;
static boost::shared_ptr<boost::asio::io_service::work> ThreadWork;
bool library_init(const char* arg1, const char* arg2, LibLog libLog)
{
#ifdef THREAD_ENABLED
ThreadWork.reset(new boost::asio::io_service::work(IoService));
aThread = boost::thread([](){
IoService.run();
});
IoService.dispatch([libLog]{
libLog(100);
});
#else
libLog(10);
#endif
return true;
}
bool res;
try{
res = library_init ("someArg1", "someArg2", this.handlerDelegate);
}catch (System.Exception e){
Debug.LogError(e.Message);
throw;
}