Unity 报错之 UnauthorizedAccessException || StackOverflowError || Exception: JNI

395 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6月更文挑战」的第9天,点击查看活动详情

在开发过程中遇到的几个错误,Unable to convert classes into dex format.,StackOverflowError,Exception: JNI: Init'd AndroidJavaClass with null ptr! , 分享一下解决方法。

错误一:Unable to convert classes into dex format.

遇到这个问题也是困扰了我好久,也在网上看了好多问题总结了几个解决方法:

  1. classes.jar冲突,unity编译时默认包含了classes.jar ,所以删除Plugins/Android/libs 下的classes.jar
  2. 检查 Assets\Plugins\Android 下是否有文件重复
  3. AndroidManifest.xml 配置问题,

遇到问题

我遇到的问题是Assets\Plugins\Android 有重复的jar包,,因为我前后导入了两个sdk到工程里面,导致了有公用的jar包重复了,所有会报错。

解决办法:

找到两个Assets\Plugins\Androidsdk 的jar包所在目录,一一对比看一下有没有重复的,

jar包重复对比

这个像这种只有日期有区别(有的可能是版本号),,留下最新的就可以了,,,完美解决问题。心情豁然开朗啊,,,

错误二:java.lang.StackOverflowError

java.lang.StackOverflowError

java.lang.StackOverflowError

stack size 8MB

android.os.MessageQueue.nativePollOnce(Native Method)

解决方案

该异常表示栈溢出。JVM中会限定栈的深度,一旦超过该深度将会报错,几种常见的场景:

  1. Layout布局嵌套太深,导致栈溢出,建议控制在5层以下;
  2. 注意线程并发数,每个线程都会申请独立的栈空间,不加控制时可能上百条线程一起把JVM限定的栈空间消耗完。
  3. 查看错误堆栈存是否存在代码嵌套递归调用。

错误三:Exception: JNI

Exception: JNI: Init'd AndroidJavaClass with null ptr!

原文详情:

Exception: JNI: Init'd AndroidJavaClass with null ptr! UnityEngine.AndroidJavaClass..ctor (IntPtr jclass) (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:562) UnityEngine.AndroidJavaObject.get_JavaLangClass () (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:540) UnityEngine.AndroidJavaObject.FindClass (System.String name) (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:531) UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:551) UnityEngine.AndroidJavaClass..ctor (System.String className) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/AndroidJavaBindings.gen.cs:92) com.moblink.unity3d.AndroidMobLinkImpl.getAndroidContext () (at Assets/plugins/MobLink/Android/AndroidMobLinkImpl.cs:67) com.moblink.unity3d.AndroidMobLinkImpl.initMobSdk () (at Assets/plugins/MobLink/Android/AndroidMobLinkImpl.cs:53) com.moblink.unity3d.AndroidMobLinkImpl.setRestoreSceneListener () (at Assets/plugins/MobLink/Android/AndroidMobLinkImpl.cs:22) com.moblink.unity3d.MobLink.setRestoreSceneListener (com.moblink.unity3d.RestoreSceneHandler sceneHander) (at Assets/plugins/MobLink/MobLink.cs:43) Demo.Start () (at Assets/Demo/Demo.cs:39)

解决办法:

1.将报错代码使用宏定义区分开,这样:

#if UNITY_ANDROID && !UNITY_EDITOR
    //报错代码...
#endif

2.在模拟器或者安卓真机上运行。