2

我正在使用Android Cardboard SDKRajawaliVRhttps://github.com/Rajawali/RajawaliVR)开发一个 VR 视频查看器,
在某些设备上,我从睡眠中返回时会崩溃(其他设备只是显示黑屏):

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.opengl.GLSurfaceView$GLThread.surfaceCreated()' on a null object reference
    at android.opengl.GLSurfaceView.surfaceCreated(GLSurfaceView.java:523)
    at android.view.SurfaceView.updateWindow(SurfaceView.java:580)
    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:176)
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1970)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5891)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view.Choreographer.doFrame(Choreographer.java:550)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5292)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

如您所见,崩溃出现在 android 代码中,我该如何开始调试呢?

4

2 回答 2

7

您可以访问源代码,所以从它开始。

假设您使用的是 Lollipop,它在这条线上失败了:

mGLThread.surfaceCreated();

错误消息指示mGLThread为空。使用 Web 浏览器对赋值 (" mGLThread =") 进行简单搜索会显示两个实例,其中最有趣的是这个

public void setRenderer(Renderer renderer) {
    ...
    mGLThread = new GLThread(mThisWeakRef);

抛开一些复杂性,mGLThread只要setRenderer()被调用就应该是非空的。因此,首先要做的是检查您的应用程序是否正在调用setRenderer()(通常在 中onCreate())。

于 2015-11-22T16:40:52.623 回答
3

如果您遵循Android Developer OpenGL 教程,Android Studio 可能会在您的 Activity 类构造函数中更正此定义:

mGLView = new MyGLSurfaceView(this);

并将其更改为

mGLView = new GLSurfaceView(this);

因为尚未对 MyGLSurfaceView 类进行编码...跳过调用 setRenderer(...) 的 MyGLSurfaveView 构造函数。上面fadden先生的回答非常好,解释了如何诊断问题。

于 2016-01-06T01:57:44.077 回答