我一直试图将PJSIP集成到我的Xamarin.Forms应用中。我成功地让iOS版本工作,但在Android版本上一直面临崩溃,没有找到解决方法。我尝试了从2.8到2.10的所有PJSIP版本,都出现了同样的问题。我也回到了样本 pjsua2xamarin
应用程序,但我得到了同样的崩溃。
崩溃日志。
[Mono] Found as 'CSharp_pjsua2xamarinfpjsua2_Endpoint_libCreate___'.
[libc] Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 30101
我做了这些事情
在Manifest中添加了以下Android权限,只是为了更全面,因为Ticket 2086提到初始化阶段的崩溃很可能与权限有关。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.CAMERA" />
我试图在模拟器和Android SDK 22版本中运行,所以我不用担心请求权限的问题。
我使用了以下配置参数。
APP_PLATFORM=android-18 TARGET_ABI=x86 ./configure-android --use-ndk-cflags --disable-video
我不知道我可以做什么来调试这个问题。有人遇到过这个问题吗?当在Xamarin Visual Studio内运行时,我可以做些什么来调试这个问题?
经过进一步调试,发现是由于pjsip的底层问题导致的崩溃。它没有指定与Xamarin正常工作。pjsip的底层代码利用JNI_OnLoad函数来检索JavaVM指针。由于Xamarin中加载库的方式,JNI_OnLoad从未被调用。这个指针是用来创建guid的。我修改了底层代码(guid_android.c),以创建guid字符串,类似于(guid_simple.c)中的方式,而不需要JavaVM指针。现在Endpoint.LibCreate没有崩溃。
然而,我怀疑JavaVM指针可能在其他地方被使用了。