Android ndk OpenSL ES slCreateEngine导致错误

Android ndk OpenSL ES slCreateEngine导致错误,android-ndk,Android Ndk,我有一个OpenSL ES函数调用,它在一个应用程序中不会导致问题,但在另一个应用程序中会导致问题,这两个应用程序都运行在同一个设备上 电话是: result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 如果结果的类型为SLresult,engineObject的类型为slObjectTF 我似乎得到的错误是: 05-19 11:56:27.007: ERROR/libOpenSLES(1425): slCreate

我有一个OpenSL ES函数调用,它在一个应用程序中不会导致问题,但在另一个应用程序中会导致问题,这两个应用程序都运行在同一个设备上

电话是:

result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
如果结果的类型为
SLresult
,engineObject的类型为
slObjectTF

我似乎得到的错误是:

05-19 11:56:27.007: ERROR/libOpenSLES(1425): slCreateEngine while another engine 0x299fa0 is active
这似乎不是从我的代码中记录的,但可能是由它引起的?那么,是什么原因导致这一行在一个应用程序中产生错误,而在另一个应用程序中不产生错误呢?

根据文档“OpenSL ES for Android支持每个应用程序一个引擎”。我快速查看了OpenSL的源代码,我可以看到这是由一个全局存储当前活动引擎强制执行的


所以,如果你想调用slCreateEngine,你必须先确保所有其他引擎都已销毁。这包括您也在链接任何第三方代码的可能性(如果您在链接之前正在链接其他正在创建OpenSL引擎对象的代码)。

碰巧,造成错误的部分原因是Android的活动生命周期,但主要是我自己的错。这是由Android为活动提供的onCreate()和onResume()方法引起的。我从未想过,在活动启动时,onResume()也会被调用。因此,我从未意识到我第二次调用了slCreateEngine函数……

是的,好吧,我能理解他们为什么选择这样做。但在我的代码中,我是唯一一个在整个应用程序中使用OpenSL的人。我提到的另一个应用程序可以很好地关闭引擎,并在每次运行时重新创建它/那么,是否有可能获得已经启动的发动机呢?因为这会立刻解决我的大部分问题。我一直在寻找这样做的可能性,但我还没有找到这样一种方法的参考。。。或者,如果不可能,如何关闭激活的引擎?正如我所确定的,我并没有创造它。。。