小编fad*_*den的帖子

了解Android紧密循环/旋转暂停错误

我正在开发一款关于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)

java android loops dalvik

5
推荐指数
1
解决办法
1813
查看次数

多个MediaCodec实例

我使用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 mediacodec

5
推荐指数
1
解决办法
3161
查看次数

关闭Dalvik VM的所有优化

所以我正在尝试为Android编写一些低级代码,我主要担心的是我想通过JIT编译器(或其他任何东西)避免所有优化.在做了一些研究之后,最好的方法似乎是:

  1. 手工编写Java字节码
  2. 使用"dx"命令将其转换为dex文件
  3. 使用"dalvikvm"命令(通过adb shell)在程序上运行它,并指定"-Xverify:none -Xdexopt:none"参数

我的问题是:这实际上是否会避免所有优化?之前的讨论https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw让我不确定,我不能100%通过阅读文档来说服自己.

任何确认方式都非常感谢.

performance android dalvik

5
推荐指数
1
解决办法
1769
查看次数

无法执行JavaVM-> DetachCurrentThread():"在仍然运行代码时尝试分离"

我有一个使用NDK的Android应用程序 - 一个带有常规UI和C++核心的常规Android Java应用程序.核心中有些地方我需要调用Java方法,这意味着我需要一个JNIEnv*for该线程,这反过来意味着我需要调用JavaVM->AttachCurrentThread()才能获得有效的env.

以前,只是做了AttachCurrentThread,根本没有分手.它在Dalvik中运行良好,但是一旦一个调用AttachCurrentThread退出而没有调用的线程,ART就会中止该应用程序DetachCurrentThread.所以我已经阅读了JNI参考资料,事实上它说我必须打电话DetachCurrentThread.但是当我这样做时,ART会使用以下消息中止应用程序:

试图在仍然运行代码时分离

这里有什么问题,以及如何DetachCurrentThread正确呼叫?

c++ java-native-interface android dalvik android-ndk

5
推荐指数
2
解决办法
4342
查看次数

当我们根本不使用GLSurface时,继续接收eglMakeCurrent失败的EGL_BAD_ALLOC报告

我的应用程序一直在关于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并持有太多的儿童观点?

在此输入图像描述

这不会一直发生.但当它发生时,我点击启动器图标,它只是一直崩溃.

我应该搜索的任何方向?

任何回复赞赏.

android glsurfaceview android-layout

5
推荐指数
0
解决办法
2607
查看次数

如何使用 NDK 创建 ANativeWindow?

我想使用 NDK 和 opengl 在后台(无 UI)中分析视频。我想解码视频并在纹理(内存)上渲染。我们怎么做?

我尝试使用 AMediaCodec 直接在纹理上渲染。但问题是它需要 ANativeWindow(在 AMediaCodec_configure 中),我无法从 opengl 纹理(使用 glGenTextures 创建)创建它。任何人都可以请建议吗?

video android android-ndk android-mediacodec

5
推荐指数
0
解决办法
1612
查看次数

Android应用更新而不丢失数据

我是Android开发的新手,所以我正在尝试创建一个存储仓库信息的应用程序.但是,我担心如果我执行更新,用户数据将会丢失.我必须管理哪些数据在更新时应保持不变?

此外,我想知道如果我想保持数据安全,使用可序列化类或使用SQL数据库是否会有所不同.

非常感谢 :)

android updating serializable data-management

5
推荐指数
1
解决办法
3577
查看次数

android dlopen()中的竞争条件?

我的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()

android dlopen race-condition android-ndk native-activity

5
推荐指数
1
解决办法
334
查看次数

JNI在应用程序中检测到错误:输入无效修改的UTF-8:非法启动字节0xfc.

我在使用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)

java-native-interface android android-ndk twilio

5
推荐指数
0
解决办法
1941
查看次数

Exoplayer 在满缓冲区上缓冲

我正在开发一个使用 ExoPlayer 播放 mp4 视频的应用程序。我已经成功设置它并播放一些视频,但有一些我不太明白的地方。当视频完全缓冲并且我向前查找时,播放器进入缓冲状态并需要一些(非常短的)时间来恢复播放。满缓冲区的时间是多少?我知道 exoplayer 不会缓冲之前的帧,但为什么它在前进时也会重新缓冲?我已将延迟跟踪到 TrackRenderers 上的“doSomeWork()”方法,但我仍然不知道如何“修复”它。我目前正在使用 ExoPlayer 演示中的代码和视频的 ExtractorRendererBuilder。

还有其他人遇到过这种情况吗?

谢谢。

android exoplayer

5
推荐指数
1
解决办法
1993
查看次数