Когда вы получили IntPtr
на нативный Android объект, то GC может в какой-то момент почистить её (скорей всего, после выхода из локального скопа). Из-за того, что я одну ссылка не сохранил, дебажил код много часов, чтоб причину крашей найти.
Ещё хуже то, что стектрейс при краше никак не помогает.
Вот такой стектрейс я наблюдал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
"UnityMain" prio=5 tid=11 Runnable native: #12 pc 00a21110 /data/app/com.unnyhog.hm-2/lib/arm/libunity.so (???) at com.unity3d.player.UnityPlayer.nativeRender(Native method) at com.unity3d.player.UnityPlayer.c(unavailable:-1) at com.unity3d.player.UnityPlayer$e$2.queueIdle(unavailable:-1) at com.unity3d.player.UnityPlayer$e.run(unavailable:-1) "UnityMain" prio=5 tid=11 Runnable native: #14 pc 00a21110 /data/app/com.unnyhog.hm-2/lib/arm/libunity.so (???) at com.unity3d.player.UnityPlayer.nativeRender(Native method) at com.unity3d.player.UnityPlayer.c(unavailable:-1) at com.unity3d.player.UnityPlayer$e$2.queueIdle(unavailable:-1) at com.unity3d.player.UnityPlayer$e.run(unavailable:-1) "UnityChoreographer" prio=5 tid=22 Native A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 9364 (UnityMain) |
Как видите, никак не помогает выявить проблему. В итоге ошибка оказалась в месте, где я кэширую ссылку на будущее.
1 |
mJavaLangClass = AndroidJNI.FindClass("java/lang/Class"); |
Преобразовал её в глобальную, падать перестало.
1 |
mJavaLangClass = CreateGlobalRef(AndroidJNI.FindClass("java/lang/Class")); |
Мораль: не забывайте преобразовывать локальные ссылки на нативные объекты в глобальные, чтоб GC их не почистил.