Android OpenSL ES安卓系统:“;“对象太多”;SL_结果_内存_故障

Android OpenSL ES安卓系统:“;“对象太多”;SL_结果_内存_故障,android,opensl,Android,Opensl,我对Android上的OpenSL ES有问题。我正在使用OpenSL播放音效。目前我正在创建一个新的播放器,每次我播放一个声音。(我知道这效率不高,但目前还“足够好”。) 播放一段时间后,我开始出现以下错误: E/libOpenSLES(25131): Too many objects W/libOpenSLES(25131): Leaving Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE) 我正在跟踪我的创建/销毁模式,在任何给定时

我对Android上的OpenSL ES有问题。我正在使用OpenSL播放音效。目前我正在创建一个新的播放器,每次我播放一个声音。(我知道这效率不高,但目前还“足够好”。)

播放一段时间后,我开始出现以下错误:

E/libOpenSLES(25131): Too many objects
W/libOpenSLES(25131): Leaving Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE)
我正在跟踪我的创建/销毁模式,在任何给定时间我都不会超过4个未完成对象,远低于系统限制32。当然,这是假设销毁工作正常

我现在唯一的猜测是,当我清理玩家对象时,我做了一些不正确的事情。一个可能的问题是经常在播放器回调的上下文中调用Destroy(基本上是在播放器播放结束后销毁它),尽管我找不到任何说明这是一个问题的参考。除了“销毁”玩家对象之外,我还有其他清理步骤吗?界面也需要清理吗

--增加--

经过更多的测试,在创建第30个玩家之后,它会一直发生(还有一个引擎和一个混合,因此总共有32个对象)。所以我不能正确地破坏这个物体。下面是代码--我想知道出了什么问题:

SLuint32 playerState = 0;

SLresult result = (*pPlayerObject)->GetState(pPlayerObject, &playerState);

return_if_fail(result);

if (playerState == SL_OBJECT_STATE_REALIZED)
{
    (*pPlayerObject)->AbortAsyncOperation(pPlayerObject);
    (*pPlayerObject)->Destroy(pPlayerObject);
}
else
{
    __android_log_print(1, LOG_TAG, "Player object in unexpected state (%d)", playerState);
    return 1002;
}
  • if(playerState==SL_对象_状态_实现)

    这是不需要的。试着一直这样做

  • Destroy=>
    中调用了
    AbortAsyncOperation

  • 所以试着用
    (*pPlayerObject)->销毁(pPlayerObject)应该足够了

  • 编辑: 我进行了测试,找到了解决方案。
    您不能从播放器
    回调调用
    Destroy()
    。应该列出“
    destroy
    ”并将其销毁到其他地方,例如,在主线程中。

    以下内容可能会对其他人有所帮助:参考上面提到的32个对象限制:如果OpenSLES在其日志中更明确地指定了他们正在谈论的内容,那就太好了。