Android NDK: Jak vyčistit nativní kód po restartu činnost?

hlasů
7

Všechno,

Jsem si vědom toho, že ve výchozím nastavení bude činnost bude zabit a restartován při změně orientace obrazovky nebo klávesnice je zasunuta dovnitř nebo ven. (Viz restart aktivita na otáčení Android ). Moje otázka je, co je správný způsob, jak řešit tento problém z nativního kódu pohledu? například pokud mám statický blok načítání nativní knihovny a moje aplikace je restartován, jak mohu zajistit, aby každá paměť v rodné zemi je řešen odpovídajícím způsobem? Problém je v tom

Když jsme se otočit zařízení, vypadá to, že samostatné vlákno bazénu je vytvořen a ty staré jsou nikdy odstraněny. To znamená, že pokaždé, když někdo otočí zařízení, máme tuny více vláken sedí líný a zabírají paměť

Jak mohu zajistit, že se to nestane? Vidím z JNIExample straně některé poznámky v dolní části:

[*] Nevyřešené problémy a chyby I když Příkladem je plně funkční, existuje několik nevyřešených otázek zbývající, které jsem nebyl schopen přijít na to tak daleko. Problémy se objeví při spuštění aktivity a stiskněte tlačítko Zpět ji skrýt, a spusťte jej znovu. Podle mých zkušeností, volání na nativní funkce v takovém přerušeného činnosti selže okázale. callVoid () jednoduše zhroucení s poruchy segmentace, zatímco volání getNewData () a getDataString () příčinu JVM potratit s chybou, protože již není spokojený s odkazem na globální mezipaměti objektů. Zdá se, že restart činnost nějakým způsobem znehodnocuje naše mezipaměti objekt odkazy, i když jsou chráněny NewGlobalRef () a aktivita probíhá v rámci původní JVM (restart aktivitou neznamená, že JVM sám se restartuje). Nemám dobré vysvětlení o tom, proč se to stane, takže pokud máte nějaké nápady, dejte mi prosím vědět.

Ale toto bylo řešeno?

Položena 21/10/2010 v 20:32
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
6

Restartování v Android NDK je nepříjemné. Jakékoli statická data, která mají hole kolem, protože opakovaně používá proces, takže je třeba ručně obnovit vše, co bude za neplatnou na základě nového běhu (jako každý OpenGL textury nebo vertex nárazníkových objektů). To vám dává nový Java závit a nové Java aplikace a další objekty stejně, takže všechny mezipaměti globální odkazy na objekty, které by byly nové v nové instance aplikace je třeba vymazány stejně.

Takže strategie jsem použít, je dvojí: minimalizovat restartuje a atomovku všechno o restartu.

Minimalizovat restartuje při manipulaci s configChanges v aplikacích, jak se píše v odpovědi na otázku, který jste propojili. Pak otevření klávesnice nebo otáčení nezpůsobí restart aplikace, která je, jak by mělo být pro všechny aplikace s non-triviální začínajících časů.

A když jsem se zjistit, že nová instance mé aplikaci začala, vydám všechno kritickou ze starého například na tom místě, včetně uvolňovat žádné předměty Java I držel přes NewGlobalRef. Snažil jsem se, aby se minimalizovalo statická data, ale jen málo nevyhnutelné místa, kde jsem se držet kolem statických objektů I jasné je, když jsem se odhalit nové instance spuštění.

Staří nitě by měl jít pryč, jakmile nejsou k dispozici žádné další nevyřešené odkazy na ně (tj, jakmile jste se uvolní všechny vaše NewGlobalRef objektů).

Odpovězeno 22/10/2010 v 19:14
zdroj uživatelem

hlasů
2

V případě, že VM je restartován, můžete začít od nuly. Pokud tomu tak není, stát je přesně tam, kde jste ji opustili. Neexistuje žádný zneplatnění mezipaměti objekt odkazy, které vytrhává věci zpod NewGlobalRef. Napsal jsem několik dalších poznámek o wooyd článek na mailing listu NDK .

Pokud máte data, která musí být inicializována, když je aktivita restartuje, měli byste přidat explicitní inicializační volání vaší činnosti (v onCreate, myslím). Ujistěte se, že jste správně odstraňte veškerý obsah, který vás zadržený z předchozího kola - DeleteLocalRef pak uložíme NULL, ne jen memset () na nulu.

Odpovězeno 22/10/2010 v 00:53
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more