2011-05-19 50 views
2

我有一個OpenSL ES函數調用,在一個應用程序中不會導致任何問題,但會導致在另一個應用程序中出現問題,它們都運行在同一個設備上。OpenSL ES slCreateEngine導致錯誤

該生產線是:

result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 

如果結果是類型SLresult的,engineObject是該類型SLObjectItf

我似乎得到的錯誤是:

05-19 11:56:27.007: ERROR/libOpenSLES(1425): slCreateEngine while another engine 0x299fa0 is active 

似乎這不是從我的代碼記錄,但也許是由它造成的?那麼,什麼原因可能會導致此行在一個應用程序中產生錯誤,但不會導致其他錯誤?

回答

1

碰巧,這部分是Android的活動生命週期造成的錯誤,但主要是我自己的錯。它是由Android爲Activity提供的onCreate()和onResume()方法引起的。我從來沒有想到onResume()也會在Activity啓動時被調用。正因爲如此,我從來沒有意識到,我有第二個電話給slCreateEngine功能.....

0

根據文檔「Android的OpenSL ES支持單個引擎每個應用程序」。我對OpenSL的源代碼進行了快速檢查,我可以看到這是由全局存儲當前活動引擎強制執行的。

所以,如果你想調用slCreateEngine,你必須確保所有其他引擎已被首先銷燬。這包括您鏈接的任何第三方代碼的可能性(例如,您在鏈接其他內容之前先創建一個OpenSL引擎對象)。

+0

是的,好吧,我可以理解他們爲什麼選擇這樣做。但是我是我的代碼中唯一一個在整個應用程序中使用OpenSL進行操作的人。我提到的那個其他應用程序關閉了引擎,並在每次運行時重新創建它。 :/ – ThaMe90 2011-05-20 06:26:24

+0

那麼有可能獲得已經有效的引擎呢?因爲這會一次解決(大部分)我的問題。我一直在尋找這樣做的可能性,但是我一直未能找到對這種方法的參考......或者如果不可能,我該如何關閉活動引擎?正如我所知道的那樣,我不會創造它...... – ThaMe90 2011-05-20 09:08:09