Странная проблема кода C ++ в NDK, Nexus One - PullRequest
1 голос
/ 24 августа 2010

У меня странная проблема, когда я запускаю свое приложение на Nexus One, Android 2.2.В своем приложении я использовал собственный .so lib, созданный под NDK.В коде Java у меня есть 2 потока: один поток пользовательского интерфейса, один для запуска кодов из native, так lib, а затем обновляет пользовательский интерфейс данными результата.В коде C ++ у меня есть глобальная переменная «int count», которая записывает время, когда вызывается определенный метод «myMethod», и число увеличивается на единицу каждый раз, когда вызывается «myMethod».Когда я запускаю свое приложение в Nexus One с Android 2.2, возникает странная проблема.В моем журнале счетчик равен 1, 2, 3, а затем появляется сообщение «08-24 12: 32: 57.961: DEBUG / dalvikvm (19244): GC_FOR_MALLOC освободил 267 объектов / 13712 байт за 48 мс».После этого события GC_FOR_MALLOC мой счетчик сбрасывается, снова начиная с 1, а затем 2, 3, 4 ... Затем кажется, что есть 2 потока, выполняющих один и тот же "myMethod", каждый выводит свою собственную трассировку, смешанную друг с другомотслеживать случайно.Например, трассировка может быть

    1, 2, 3, GC_FOR_MALLOC, 1, 2, 3, 4, 5, GC_FOR_MALLOC, 4, 5, 6, GC_FOR_MALLOC, 6, 7...

Когда я запускаю одно и то же приложение с точно таким же кодом на Android Emulator, 2.1 или 2.2, проблема никогда не обнаруживалась, и в эмуляторе нет события GC_FOR_MALLOC.

Кто-нибудь сталкивался с этой проблемой раньше?Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Похоже, что сборщик мусора подметает класс, который загрузил вашу библиотеку, и он перезагружается (и повторно устанавливает вашу глобальную переменную) при последующих вызовах. Где вы загружаете библиотеку?

1 голос
/ 24 августа 2010

Может быть, попробовать использовать ключевое слово volatile в переменной? http://www.drdobbs.com/184403766

Когда вы создаете родной класс? Какой поток вызывает myMethod? Который читает счет? Это может быть связано с оптимизацией компилятора. Возможно, объяснит, почему эмулятор, выполняющий код отладки, не увидит проблему. Просто предположение на основе предоставленной информации.

...