我正在开发一款关于android的游戏,"Space RPG" - 目前只在大多数Galaxy S4和HTC Ones上看到这个错误.这都是Java.
游戏将停止,当我尝试调试进程并暂停有问题的线程时,它将不会挂起,并且会发生旋转挂起错误.线程转储让我看到它在一个特定的while循环中,它正在采取所需的"结束位置"并在不断增加的距离步骤向后迭代以找到"起始位置".
这是事情变得烦人的地方.我可以验证循环无法无限运行,即使条件是while(true),在我的break被调用之前它不可能运行超过200次迭代(这个断言由正在运行的代码备份)我试过的每一部电话).
为了帮助我缓解这个问题,我在循环中添加了一个简单的递增变量,如果它超过1000,它会记录一些东西,所以我可以看到DID运行太多次,以防万一设置了一些变量严重或某事. 当此计数器代码存在时,不会发生崩溃/挂起.我也没有看到任何日志表明它跑了1000多次.
如果我删除此计数器,则每次播放5-10秒后都会发生挂起[其中while循环可能会运行10次,尽管有所不同].
因此,我的问题是,到底发生了什么?:P为什么这些较新的手机(但似乎没有旧款手机)在执行有效工作的循环中存在问题,并且在没有增量变量的情况下不会持续很长时间.线程如何可能在该循环中停止,以及如何使用额外的计数器变量来解决问题?这项工作是在opengl渲染线程上完成的,如果这很重要的话.
我有关于大多数S4发生这种情况的报告,但至少有一个S4在那里没有发生.我今天使用的那个正在发生.这让我想知道它是否可能与特定的android,java,dalvik或手机上的其他东西有关,但遗憾的是我没有从S4工作的任何细节.
非常感谢任何有关此类内容的帮助,指导,想法或进一步阅读.
float vel = 1.0f; // final velocity is 1. We are working backwards to find out what the starting velocity will need to be.
int i = 0;
double xmath = Math.sin(rot* (Math.PI/180.0f)); // component of velocity for x,y direction based on rotation
double ymath = Math.cos(rot* (Math.PI/180.0f));
while (true) {
/* with this section uncommented, the stall never happens...
++i;
if (i>1000) {
// Something …
Run Code Online (Sandbox Code Playgroud) 我使用MediaCodec库制作了一个视频播放器,我想添加一个播放列表功能.我试图有两个MediaCodec实例,以便在两个连续的视频之间进行更平滑的过渡,但是这似乎很危险,在某些设备中(我尝试使用带有氰的S4)它完美地工作,但是在S4中使用TouchWiz同样如此代码在媒体编解码器声明中崩溃.这是代码片段:
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(path1);
MediaFormat format = extractor.getTrackFormat(0);
String mime = format.getString(MediaFormat.KEY_MIME);
extractor.selectTrack(0);
MediaCodec decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(format, null, null, 0);
MediaExtractor extractor2 = new MediaExtractor();
extractor2.setDataSource(path2);
MediaFormat format2 = extractor2.getTrackFormat(0);
String mime2 = format.getString(MediaFormat.KEY_MIME);
extractor2.selectTrack(0);
MediaCodec decoder2 = MediaCodec.createDecoderByType(mime2);
decoder2.configure(format2, null, null, 0);
Run Code Online (Sandbox Code Playgroud)
我在TouchWiz S4上获得的例外是
E/ACodec(17651): configureCodec multi window instance fail appPid : 17651
E/ACodec(17651): [OMX.qcom.video.decoder.avc] configureCodec returning error -38
E/MediaCodec(17651): Codec reported an error. (omx error 0x80001001, internalError -38)
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出一些如何正确做到这一点的指导方针吗?也许不同的线程?我真的想在不同视频之间进行平滑过渡,但我需要它至少在某些设备上一致地工作.
非常感谢
所以我正在尝试为Android编写一些低级代码,我主要担心的是我想通过JIT编译器(或其他任何东西)避免所有优化.在做了一些研究之后,最好的方法似乎是:
我的问题是:这实际上是否会避免所有优化?之前的讨论https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw让我不确定,我不能100%通过阅读文档来说服自己.
任何确认方式都非常感谢.
我有一个使用NDK的Android应用程序 - 一个带有常规UI和C++核心的常规Android Java应用程序.核心中有些地方我需要调用Java方法,这意味着我需要一个JNIEnv*
for该线程,这反过来意味着我需要调用JavaVM->AttachCurrentThread()
才能获得有效的env
.
以前,只是做了AttachCurrentThread
,根本没有分手.它在Dalvik中运行良好,但是一旦一个调用AttachCurrentThread
退出而没有调用的线程,ART就会中止该应用程序DetachCurrentThread
.所以我已经阅读了JNI参考资料,事实上它说我必须打电话DetachCurrentThread
.但是当我这样做时,ART会使用以下消息中止应用程序:
试图在仍然运行代码时分离
这里有什么问题,以及如何DetachCurrentThread
正确呼叫?
我的应用程序一直在关于Android 4.4.x设备,三星,xiaomi的崩溃报告......
java.lang.IllegalStateException: eglMakeCurrent failed EGL_BAD_ALLOC
at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1354)
at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:1241)
at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:1058)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1580)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1030)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5639)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5047)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:807)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:623)
at dalvik.system.NativeStart.main(NativeStart.java)
Run Code Online (Sandbox Code Playgroud)
我做了一些谷歌,但我的应用程序没有使用任何GLSurfaceView,只使用Android标准视图模块.
也许是因为我正在使用Fragment并持有太多的儿童观点?
这不会一直发生.但当它发生时,我点击启动器图标,它只是一直崩溃.
我应该搜索的任何方向?
任何回复赞赏.
我想使用 NDK 和 opengl 在后台(无 UI)中分析视频。我想解码视频并在纹理(内存)上渲染。我们怎么做?
我尝试使用 AMediaCodec 直接在纹理上渲染。但问题是它需要 ANativeWindow(在 AMediaCodec_configure 中),我无法从 opengl 纹理(使用 glGenTextures 创建)创建它。任何人都可以请建议吗?
我是Android开发的新手,所以我正在尝试创建一个存储仓库信息的应用程序.但是,我担心如果我执行更新,用户数据将会丢失.我必须管理哪些数据在更新时应保持不变?
此外,我想知道如果我想保持数据安全,使用可序列化类或使用SQL数据库是否会有所不同.
非常感谢 :)
我的Android应用程序有一个简单的"加载器"NativeActivity,它非常简单android_main()
,只加载不同的共享对象并将控制传递给它:
typedef void (*Tandroid_main)( android_app*);
void android_main( android_app* state )
{
void* glib = dlopen("libmain.so", RTLD_NOW);
void* fmain = dlsym(glib, "android_main");
Tandroid_main libmain = (Tandroid_main)fmain;
libmain(state)
}
Run Code Online (Sandbox Code Playgroud)
这很好..大约一半的时间.其他时候它崩溃,因为dlopen()
失败并返回NULL与errno = 2(没有这样的文件).
由于这种情况的奇怪不一致,我怀疑时间问题,事实上,添加一个sleep(1)
之前dlopen()
阻止它发生.比sleep(1)
在循环中尝试它更强大的东西:
int count = 0;
void* glib = dlopen(soName, RTLD_NOW);
while(glib == NULL) {
sched_yield();
++count;
glib = dlopen(soName, RTLD_NOW);
}
Run Code Online (Sandbox Code Playgroud)
我从这个循环获得的计数通常在我的设备上的范围为10-70.但这是一个丑陋丑陋的解决方案.
这是怎么回事?为什么我只能在NativeActivity启动后稍微加载其他共享对象?有没有更好的方法来找到什么时候加载它是安全的?
应该注意的是,我也在使用System.loadLibrary("main")
NativeActivity进行调用onCreate()
我在使用Twilio SDK启动呼叫时遇到此错误.
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xfc
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] string: '100.90.133.117???*?'
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] in call to NewStringUTF
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] "Thread-1849" prio=5 tid=43 Runnable
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x1e1b5560 self=0xb8b125b0
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | sysTid=27495 nice=0 cgrp=apps sched=0/0 handle=0xb87bb970
02-20 11:19:51.366: A/art(27475): art/runtime/check_jni.cc:65] | state=R schedstat=( 794242861 121820754 4071 ) utm=53 stm=26 core=0 HZ=100
02-20 11:19:51.366: …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 ExoPlayer 播放 mp4 视频的应用程序。我已经成功设置它并播放一些视频,但有一些我不太明白的地方。当视频完全缓冲并且我向前查找时,播放器进入缓冲状态并需要一些(非常短的)时间来恢复播放。满缓冲区的时间是多少?我知道 exoplayer 不会缓冲之前的帧,但为什么它在前进时也会重新缓冲?我已将延迟跟踪到 TrackRenderers 上的“doSomeWork()”方法,但我仍然不知道如何“修复”它。我目前正在使用 ExoPlayer 演示中的代码和视频的 ExtractorRendererBuilder。
还有其他人遇到过这种情况吗?
谢谢。
android ×10
android-ndk ×4
dalvik ×3
c++ ×1
dlopen ×1
exoplayer ×1
java ×1
loops ×1
mediacodec ×1
performance ×1
serializable ×1
twilio ×1
updating ×1
video ×1