我有一个使用Xamarin用C#编写的android应用。它使用SWIG(如果重要,https://github.com/OpenVPN/openvpn3)包装的C ++库。我可以正常使用线程,但是在对C ++代码进行某些调用之后,所有线程似乎都已挂起。最终,我收到一条通知,通知我的应用程序已挂起,因为UI线程停止响应。
所讨论的代码涉及一个C#类,该类将C ++类子类化(通过SWIG包装器)。我可以在该库中调用其他C ++代码。例如,我的设置包括调用静态方法以初始化库,构造类的实例并在该类上调用方法以为其提供一些配置。当我在C#类上调用connect
(最终通过SWIG magic调用C ++实现)时,线程似乎停止正常运行。
在调用connect
之前,我对线程的任何使用都可以正常工作。 connect
之后,任何尝试启动线程的尝试都会永远阻塞,UI线程将变为挂起状态。
我已经退出了OpenVPN库本身。当它到达内部以至于我想尝试启动它自己的线程来处理UDP数据包时,我看到了日志停止。我的解释是,当C ++代码尝试启动也会永远挂起的新线程时。
如果我在管理OpenVPN C ++代码的同一线程中手动启动一个新线程(即,在调用connect
之后但尝试生成它自己的新线程之前,在其中一个回调中)挂在那里而不是继续。我的解释是,尝试启动我的线程已挂起执行C ++工作的线程,以致无法继续。
我确实正在使用Android VpnService,因为我将需要它来处理路由表和设备权限。我不确定这是否与这个问题有关。