1

当我在 Nexus One、Android 2.2 上运行我的应用程序时,我遇到了一个奇怪的问题。在我的应用程序中,我使用了在 NDK 下构建的本机 .so 库。在 Java 代码中,我有 2 个线程:一个 UI 线程,一个从本机 so lib 运行代码,然后使用结果数据更新 UI。在 C++ 代码中,我有一个全局变量“int count”,它记录了特定方法“myMethod”被调用的次数,每次“myMethod”被调用时计数加一。当我使用 Android 2.2 在 Nexus One 中运行我的应用程序时,出现了奇怪的问题。在我的日志中,计数为 1、2、3,然后有一条消息显示“08-24 12:32:57.961: DEBUG/dalvikvm(19244): GC_FOR_MALLOC 在 48 毫秒内释放了 267 个对象/13712 个字节”。在这个 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 事件。

有人遇到过这个问题吗?谢谢您的帮助!

4

2 回答 2

1

听起来垃圾收集器正在清理加载库的类,并且在后续调用中重新加载(并重新设置全局变量)。你在哪里加载图书馆?

于 2010-10-22T12:11:47.727 回答
1

也许尝试在变量上使用 volatile 关键字? http://www.drdobbs.com/184403766

你什么时候启动本地类?哪个线程调用 myMethod?哪个读取计数?这可能是由于编译器优化。也许可以解释为什么模拟器运行调试代码不会看到问题。只是根据提供的信息进行猜测。

于 2010-08-24T11:10:07.357 回答