Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从不同线程(Android)中的非托管代码调用Unity C委托 我将委托日志记录函数传递给非托管代码,并且它工作正常,除非它是从另一个线程调用的,这是C++库内部的。 我读了,但是我找不到任何信息,当我涉及C++线程时,我应该期待什么。这肯定是线程问题,因为当我从从Unity调用非托管函数的同一线程调用委托时,委托就起作用了_C#_Android_C++_Multithreading - Fatal编程技术网

C# 从不同线程(Android)中的非托管代码调用Unity C委托 我将委托日志记录函数传递给非托管代码,并且它工作正常,除非它是从另一个线程调用的,这是C++库内部的。 我读了,但是我找不到任何信息,当我涉及C++线程时,我应该期待什么。这肯定是线程问题,因为当我从从Unity调用非托管函数的同一线程调用委托时,委托就起作用了

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; } 来找出你的线有

C

C++头文件

C++源代码


所以,当定义了“线程启用”时,应用程序会在没有其他信息的情况下自动崩溃。

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;
}