首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试GLSurfaceView内部崩溃?

如何调试GLSurfaceView内部崩溃?
EN

Stack Overflow用户
提问于 2015-11-22 19:10:37
回答 2查看 4.1K关注 0票数 2

我正在开发一个使用Android Cardboard SDKRajawaliVR (https://github.com/Rajawali/RajawaliVR)的VR视频查看器

在一些设备上,我从睡眠中返回时会崩溃(其他设备只是显示黑屏):

代码语言:javascript
复制
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代码中,我该如何开始调试呢?

EN

回答 2

Stack Overflow用户

发布于 2015-11-23 00:40:53

您有权访问源代码,因此请从源代码开始。

假设您使用的是棒棒糖,那么它将导致on this line失败

代码语言:javascript
复制
mGLThread.surfaceCreated();

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

代码语言:javascript
复制
public void setRenderer(Renderer renderer) {
    ...
    mGLThread = new GLThread(mThisWeakRef);

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

票数 7
EN

Stack Overflow用户

发布于 2016-01-06 09:57:44

如果您正在使用Android Developer OpenGL tutorial,那么Android Studio可能在您的Activity类构造函数中更正了这个定义:

代码语言:javascript
复制
mGLView = new MyGLSurfaceView(this);

并将其更改为

代码语言:javascript
复制
mGLView = new GLSurfaceView(this);

因为类MyGLSurfaceView还没有编码到MyGLSurfaveView构造函数,这就是setRenderer(...)是调用的。fadden先生上面的回答很好,解释了如何诊断问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33854093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档