【问题标题】:Android App Crashes Suddenly while running?Android应用程序在运行时突然崩溃?
【发布时间】:2012-06-26 18:36:40
【问题描述】:

我的应用能做什么? 我正在开发的应用程序是一个典型的客户端服务器应用程序,它使用 Wifi 与 Windows 服务器通信。该应用程序有多个活动,并且确实需要大量内存和 CPU,即对 speex 编码/解码的本机调用。

我的问题是什么? 问题是应用程序在正常工作时突然重新启动。有时在正常工作时突然我看到(在 logcat 中)应用程序类的构造函数(扩展 API 应用程序类的类)被调用。这会使我的应用程序崩溃,因为所有全局数据都存储在 Application 类本身中。

我做了什么? 让我想到的第一件事是,可能是 Android 觉得他们的内存不足,所以它终止了我的应用程序,然后自动重新启动它。所以我实现了Application类的onLowMemory()。但令我惊讶的是,它从未被调用..

主要问题是什么?主要问题是Nothing is printed on LogCat。看起来即使是 Android 本身也不知道为什么要重新启动我已经运行的应用程序?

这次突然重启的可能原因是什么?我怎样才能避免这种情况?

我正在开发 Galaxy Y,API 版本是 2.3.6。我的 AndroidManifiest.xml 看起来像

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="some.package.MyApp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:maxSdkVersion="15"
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:name="some.package.MyApp"
        android:icon="@drawable/display_image"
        android:label="@string/app_name" >
        <activity
            android:name="some.package.LoginActivity"
            android:configChanges="keyboardHidden|orientation"
            android:label="@string/app_name"
            android:screenOrientation="user" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="some.package.BuddyListActivity"
            android:configChanges="keyboardHidden|orientation"
            android:label="@string/app_name"
            android:screenOrientation="user"
            android:theme="@android:style/Theme.Black.NoTitleBar" >

            <!--
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            -->
        </activity>
        <activity
            android:name="some.package.SessionWindowActivity"
            android:configChanges="keyboardHidden|orientation"
            android:label="@string/app_name"
            android:screenOrientation="user"
            android:theme="@android:style/Theme.Black.NoTitleBar" >

            <!--
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            -->
        </activity>
    </application>

</manifest>

编辑 我刚刚在使用 CheckJNI 后在 LogCat 中看到了以下输出,

06-26 17:27:30.023: I/remove(24544): Sending Signal : 13 **//App Working fine here**
06-26 17:27:32.148: D/dalvikvm(24544): GC_CONCURRENT freed 446K, 49% free 3384K/6599K, external 1057K/1076K, paused 3ms+4ms
06-26 17:27:39.531: W/dalvikvm(24544): **HeapWorker may be wedged: 7374ms spent** inside LsomePackageName/modules/AudioPlayer;.finalize()V
06-26 17:27:40.023: I/remove(24544): Sending Signal : 13
06-26 17:27:40.218: D/dalvikvm(24544): GC_CONCURRENT freed 479K, 49% free 3383K/6599K, external 1057K/1076K, paused 9ms+5ms 
06-26 17:27:42.343: E/RoobrooApp(24670): Application Instance created **//Restarted** 
06-26 17:27:42.351: I/ApplicationPackageManager(24670): cscCountry is not German : INS

更新 在一步进一步试验时,我故意为双数组分配了一个非常大的内存。但令我惊讶的是,既没有调用 onLowMemory(),也没有重新启动应用程序,而是我得到了 outOfMemoryException。如果永远不会调用 onLowMemory() 为什么它会在那里?

还有一个问题是,重启后操作系统已经启动了 BuddyListActivity 而不是 LoginActivity... 真的需要帮助 ....

更新 2 我刚看到下面的错误日志,我真的不知道这是什么意思..

06-29 12:07:28.398: W/dalvikvm(19308): ReferenceTable overflow (max=1024)
06-29 12:07:28.398: W/dalvikvm(19308): Last 10 entries in JNI pinned array reference table:
06-29 12:07:28.398: W/dalvikvm(19308):  1014: 0x405b0280 cls=[B (340 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1015: 0x405b03d8 cls=[S (660 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1016: 0x405d8208 cls=[B (340 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1017: 0x405d8360 cls=[S (660 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1018: 0x405f8b08 cls=[B (340 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1019: 0x405f8c60 cls=[S (660 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1020: 0x405f8ef8 cls=[B (340 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1021: 0x405ff698 cls=[S (660 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1022: 0x405f9050 cls=[B (340 bytes)
06-29 12:07:28.398: W/dalvikvm(19308):  1023: 0x405ff930 cls=[S (660 bytes)
06-29 12:07:28.398: W/dalvikvm(19308): JNI pinned array reference table summary (1024 entries):
06-29 12:07:28.398: W/dalvikvm(19308):     1 of [B 20B
06-29 12:07:28.398: W/dalvikvm(19308):   508 of [B 340B (508 unique)
06-29 12:07:28.398: W/dalvikvm(19308):     3 of [B 348B (3 unique)
06-29 12:07:28.406: W/dalvikvm(19308):   511 of [S 660B (511 unique)
06-29 12:07:28.406: W/dalvikvm(19308):     1 of [S 668B
06-29 12:07:28.406: W/dalvikvm(19308): Memory held directly by tracked refs is 511712 bytes
06-29 12:07:28.406: E/dalvikvm(19308): Failed adding to JNI pinned array ref table (1024 entries)
06-29 12:07:28.406: I/dalvikvm(19308): "Thread-14" prio=5 tid=12 RUNNABLE
06-29 12:07:28.406: I/dalvikvm(19308):   | group="main" sCount=0 dsCount=0 obj=0x4050e548 self=0x2240b8
06-29 12:07:28.406: I/dalvikvm(19308):   | sysTid=19953 nice=-19 sched=0/0 cgrp=[fopen-error:2] handle=1905240
06-29 12:07:28.406: I/dalvikvm(19308):   | schedstat=( 207153329 82244881 1015 )
06-29 12:07:28.406: I/dalvikvm(19308):   at some.package.MyApp.speex.SpeexEncoder.encode(Native Method)
06-29 12:07:28.406: I/dalvikvm(19308):   at some.package.MyApp.speex.SpeexEncoder.encodeFrame(SpeexEncoder.java:51)
06-29 12:07:28.406: I/dalvikvm(19308):   at some.package.MyApp.models.Session.capturedAudioReceived(Session.java:656)
06-29 12:07:28.406: I/dalvikvm(19308):   at some.package.MyApp.modules.AudioCapturer.run(AudioCapturer.java:118)
06-29 12:07:28.406: I/dalvikvm(19308):   at java.lang.Thread.run(Thread.java:1019)
06-29 12:07:28.406: E/dalvikvm(19308): VM aborting
06-29 12:07:29.726: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting
06-29 12:07:30.351: W/dalvikvm(19308): threadid=4: spin on suspend #1 threadid=1 (pcf=0)
06-29 12:07:30.898: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting
06-29 12:07:31.101: W/dalvikvm(19308): threadid=4: spin on suspend #2 threadid=1 (pcf=0)
06-29 12:07:31.101: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE
06-29 12:07:31.101: I/dalvikvm(19308):   | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898
06-29 12:07:31.101: I/dalvikvm(19308):   | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600
06-29 12:07:31.101: I/dalvikvm(19308):   | schedstat=( 1556395 4913328 26 )
06-29 12:07:31.101: I/dalvikvm(19308):   at dalvik.system.NativeStart.run(Native Method)
06-29 12:07:31.101: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE
06-29 12:07:31.101: I/dalvikvm(19308):   | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8
06-29 12:07:31.101: I/dalvikvm(19308):   | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496
06-29 12:07:31.101: I/dalvikvm(19308):   | schedstat=( 5364166234 3306213349 13647 )
06-29 12:07:31.101: I/dalvikvm(19308):   at android.media.AudioTrack.native_write_short(Native Method)
06-29 12:07:31.101: I/dalvikvm(19308):   at android.media.AudioTrack.write(AudioTrack.java:943)
06-29 12:07:31.101: I/dalvikvm(19308):   at some.package.MyApp.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163)
06-29 12:07:31.101: I/dalvikvm(19308):   at android.media.AudioTrack$NativeEventHandlerDelegate$1.handleMessage(AudioTrack.java:1084)
06-29 12:07:31.101: I/dalvikvm(19308):   at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 12:07:31.101: I/dalvikvm(19308):   at android.os.Looper.loop(Looper.java:130)
06-29 12:07:31.101: I/dalvikvm(19308):   at android.app.ActivityThread.main(ActivityThread.java:3687)
06-29 12:07:31.101: I/dalvikvm(19308):   at java.lang.reflect.Method.invokeNative(Native Method)
06-29 12:07:31.101: I/dalvikvm(19308):   at java.lang.reflect.Method.invoke(Method.java:507)
06-29 12:07:31.101: I/dalvikvm(19308):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
06-29 12:07:31.101: I/dalvikvm(19308):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
06-29 12:07:31.101: I/dalvikvm(19308):   at dalvik.system.NativeStart.main(Native Method)
06-29 12:07:31.851: W/dalvikvm(19308): threadid=4: spin on suspend #3 threadid=1 (pcf=0)
06-29 12:07:31.851: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE
06-29 12:07:31.851: I/dalvikvm(19308):   | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898
06-29 12:07:31.851: I/dalvikvm(19308):   | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600
06-29 12:07:31.851: I/dalvikvm(19308):   | schedstat=( 2868652 6927485 37 )
06-29 12:07:31.851: I/dalvikvm(19308):   at dalvik.system.NativeStart.run(Native Method)
06-29 12:07:31.851: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE
06-29 12:07:31.851: I/dalvikvm(19308):   | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8
06-29 12:07:31.851: I/dalvikvm(19308):   | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496
06-29 12:07:31.851: I/dalvikvm(19308):   | schedstat=( 5364166234 3306213349 13647 )
06-29 12:07:32.000: I/dalvikvm(19308):   at android.media.AudioTrack.native_write_short(Native Method)
06-29 12:07:32.015: I/dalvikvm(19308):   at android.media.AudioTrack.write(AudioTrack.java:943)
06-29 12:07:32.031: I/dalvikvm(19308):   at some.package.MyApp.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163)
06-29 12:07:32.039: I/dalvikvm(19308):   at android.media.AudioTrack$NativeEventHandlerDelegate$1.handleMessage(AudioTrack.java:1084)
06-29 12:07:32.054: I/dalvikvm(19308):   at android.os.Handler.dispatchMessage(Handler.java:99)
06-29 12:07:32.054: I/dalvikvm(19308):   at android.os.Looper.loop(Looper.java:130)
06-29 12:07:32.062: W/AudioTrack(19308): obtainBuffer() track 0x1d3520 disabled, restarting
06-29 12:07:32.070: I/dalvikvm(19308):   at android.app.ActivityThread.main(ActivityThread.java:3687)
06-29 12:07:32.093: I/dalvikvm(19308):   at java.lang.reflect.Method.invokeNative(Native Method)
06-29 12:07:32.101: I/dalvikvm(19308):   at java.lang.reflect.Method.invoke(Method.java:507)
06-29 12:07:32.109: I/dalvikvm(19308):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
06-29 12:07:32.125: I/dalvikvm(19308):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
06-29 12:07:32.132: I/dalvikvm(19308):   at dalvik.system.NativeStart.main(Native Method)
06-29 12:07:32.890: W/dalvikvm(19308): threadid=4: spin on suspend #4 threadid=1 (pcf=0)
06-29 12:07:32.890: I/dalvikvm(19308): "Signal Catcher" daemon prio=5 tid=4 RUNNABLE
06-29 12:07:32.890: I/dalvikvm(19308):   | group="system" sCount=0 dsCount=0 obj=0x40510490 self=0x159898
06-29 12:07:32.890: I/dalvikvm(19308):   | sysTid=19312 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=1575600
06-29 12:07:32.890: I/dalvikvm(19308):   | schedstat=( 5340582 316192616 59 )
06-29 12:07:32.898: I/dalvikvm(19308):   at dalvik.system.NativeStart.run(Native Method)
06-29 12:07:32.898: I/dalvikvm(19308): "main" prio=5 tid=1 RUNNABLE
06-29 12:07:32.898: I/dalvikvm(19308):   | group="main" sCount=1 dsCount=0 obj=0x40022198 self=0xcec8
06-29 12:07:32.898: I/dalvikvm(19308):   | sysTid=19308 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345006496
06-29 12:07:32.898: I/dalvikvm(19308):   | schedstat=( 5364166234 3306213349 13647 )
06-29 12:07:32.929: I/dalvikvm(19308):   at android.media.AudioTrack.native_write_short(Native Method)
06-29 12:07:32.945: I/dalvikvm(19308):   at android.media.AudioTrack.write(AudioTrack.java:943)
06-29 12:07:32.953: I/dalvikvm(19308):   at some.package.MyApp.modules.AudioPlayer.onPeriodicNotification(AudioPlayer.java:163)

解决方案 好吧,更改代码的测试仍在进行中,到目前为止一切似乎都是积极的。问题出在 JNI 内部(我猜)。 @n.Collins 声明 “JVM 未报告错误这一事实也表明它是由您的本机代码引起的。” 是指向解决方案的最正确指针之一。我真的很感谢所有回答它的人真的以某种方式帮助了我。多亏了社区,我在尝试解决这个问题时实际上删除了一组其他错误。

【问题讨论】:

  • 我知道 onLowMemory 没有被调用;但是,您是否尝试过监控内存使用情况以查找内存泄漏?此外,您确定没有任何内容打印到 logcat。我只要求过滤您的应用程序标签实际上可能会阻止看到所有适用的崩溃消息。确保您在崩溃期间查看的是未过滤的 logcat 视图。
  • onLowMemory() 不能保证根据文档被调用。我观察到 OutOfMemoryErrors 在本机(也可能在 Java 中)代码可能会导致应用程序崩溃而没有任何消息或日志。
  • Android 3.0 之前的那些 DDMS 视图并不总是可靠地跟踪原生代码分配。
  • 看起来问题出在 jni 上。您可能需要考虑在 jni 中添加更多调试符号。 groups.google.com/forum/?fromgroups#!topic/android-developers/….
  • 关于你的最后一个问题,关于不从你的 LAUNCHER Activity 开始,你可以在这里查看我的问题。我有类似的问题stackoverflow.com/questions/11243019/…

标签: android android-ndk


【解决方案1】:

如果没有完整的源代码,很难判断到底发生了什么,但也许 Romain Guy 在 Google 网上论坛上的回答 here 会有所帮助。

onLowMemory()在整个系统用完时调用 内存,而不是当您的进程内存不足时。每个应用程序都是 仅限于固定数量的 RAM(例如 Nexus One 上为 24 MB)。 如果您用完这 24 MB 但系统仍有更多可用 RAM, 你会得到一个OutOfMemoryError但不是onLowMemory()

android:largeHeap="true" 添加到 application 标记将执行此操作(尽管不能保证)。

注意:在修改后的固件(自定义 ROM)上,该值可能会更低或更高。我相信三星 Galaxy Nexus 默认为 48mb,但作为一般规则,保持在 24mb 以内是一个安全的假设。索尼爱立信上还有一个great post 解释了姜饼和冰淇淋三明治之间的技术差异(RAM 是一个深入讨论的主题)。

祝你好运,我希望这至少可以帮助你找到问题。

【讨论】:

  • 我刚读了几篇博客,看到了关于 Android 内存问题的 Google IO 2011 视频会议。学习并解决了一些漏洞。但问题仍然是他们的......
  • @anDroider 没有你的源代码很难判断问题是什么,但所有迹象都指向某种性能问题。如果您在运行 API 11 或更高版本且 largeHeap="true" 的高端设备上尝试过,这些结果是否相同?那,或者在您的本机代码中添加一些日志调用,看看它们在哪里停止。也许你有一些你不知道的无限递归或循环或内存泄漏。
  • 在 Nexus 上是 16mb,我使用:long heap = Debug.getNativeHeapAllocatedSize() / 1024;在允许用户继续加载图片以在堆变得太接近 16mb 之前停止它们的应用程序上,并继续将该数字发送到 logcat 以帮助调试泄漏的应用程序。
  • 感谢@MartinSykes,这对 RAM 密集型应用程序绝对有帮助。我确信它会因设备而异,有些像新的三星 Galaxy S3 可能会允许 24mb,如果不是 48mb,尤其是在使用 largeHeap="true" 时。
【解决方案2】:

其他海报已涵盖内存不足的问题。我将添加它来调试您的本机代码,一种快速而肮脏的方法是在各个检查点添加日志消息。这是我的一个原生 cpp 文件的示例:

#include <android/log.h>

...

// Set to 1 to enable debug log traces...
#define DEBUG  0

#define LOG_TAG         "yourNativeCodeLogTag"
#if DEBUG
#define LOG_ERROR(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOG_WARN(...)   __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOG_INFO(...)   __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOG_DEBUG(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else // if !DEBUG
#define LOG_ERROR(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOG_WARN(...)   __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOG_INFO(...)   
#define LOG_DEBUG(...) 
#endif // DEBUG

...

extern "C"
JNIEXPORT void JNICALL Java_com_whatever_package_YourClassName_jniInitializeLibrary(JNIEnv * env, jobject thiz, /* other irrelevant stuff here */)                 
{    
    LOG_DEBUG("Initializing native library.\n");
    ....
}

最后,您还需要将-llog 添加到相关*.mk 文件中的LOCAL_LDLIBS 变量中。然后,您可以从 logcat 中的本机库中获取日志消息。

更新:看到您的更新后,我认为您应该使用上述技术将日志消息添加到您的本机 encode() 方法中,以查看崩溃的确切位置。

【讨论】:

    【解决方案3】:

    我没有足够的代表来评论其他人的答案,但我认为Error 454's answer 非常接近。

    我自己的应用程序也遇到了类似的问题,应用程序在没有消息的情况下重新启动。我的问题是由数组溢出引起的,我试图在本机代码中访问n 对象数组中的索引n+1。 JVM没有报错也说明是你的native代码造成的。

    这个问题:c++ Jni Reference Table overflow 的错误日志与您的更新 2 非常相似,进一步表明您的错误在于与您的 get 和 release 调用不匹配。

    如果您不明白JNI pinned reference table 是什么,我想将您的注意力引向JNI Specification sections titled "Accessing Java Objects", and the following section "Accessing Primitive Arrays"

    最后,访问原始数据数组的本机代码的一些 sn-ps 将有助于解决您的问题,但与此同时,我想提请您注意对 ReferenceTable overflow (max=512) JNI 答案的最终评论内容如下:

    GetObjectArrayElement 返回带有本地引用的对象,因此您需要删除本地引用。但是只有在完成数组元素时才应该这样做。所以你应该把DeleteLocalRef(oneDim)放在releaseIntArrayElements(oneDim)之后。

    所以请在您访问数组元素时仔细检查您是否匹配了 Get/Release 调用,当您不再需要访问它时,删除本地引用。您可能会遇到 JNI 固定引用表的末尾,因为您没有删除旧对象。请记住,JNI 只是 Java 的一个 c 接口,因此您必须帮助您的本机代码进行垃圾收集。

    【讨论】:

    • 当我在 ReleseArrayElements 之后尝试 DeleteLocalRef 时,我收到了几条 JNI WARNING: DeleteLocalRef(0x40536dc8) failed to find entry (valid=0) 消息并且应用程序崩溃了......
    • 我不使用 GetObjectArrayElement() 而是使用 GetByteArrayElement 和 GetShortArrayElement 以及它们的 Release 方法...我还需要 DeleteLocalRef... 如果不是如何删除数组占用的内存参考资料(如果有的话)?
    • 您在Release&lt;PrimitiveType&gt;ArrayElements 调用中为mode 参数使用了什么值?如果没有看到您的一些本机代码,我们真的无法提供更多帮助。显示您如何使用 get/release 方法以及您如何处理中间数据的 sn-p 会很有用。
    • 实际上,我通过阅读您的声明“如果应用程序崩溃并且没有告诉任何内容,这意味着这是因为 JNI 中的一些错误”,我得到了信心。...然后我进一步调试并阅读了更多关于Speex 音频解码...事实证明,speex 的功能之一有时会返回意外值。我更正了代码,到目前为止它还没有崩溃...谢谢我还编辑了问题以在其中提及您的名字。 ..祝您有美好的一天...
    • @Amit 您说收到 JNI 警告:DeleteLocalRef(0x40536dc8) 在使用 Release...ArrayElements 时找不到条目 (valid=0)。这和我得到的一样。我也使用 Speex,所以我们在代码中遇到了同样的错误 ;) - 当我大约一年前引入发布代码时,我的崩溃消失了,但现在我在每个 Speex 帧上都会收到这些烦人的日志消息。你摆脱它了吗?
    【解决方案4】:

    根据更新 #2,很明显您未能取消固定 JNI 中的数组。这意味着您正在使用Get&lt;Type&gt;ArrayElements,并且未能将这些调用中的一个或多个与Release&lt;Type&gt;ArrayElements 匹配。

    因此,ReferenceTable 溢出。查找您调用 Get 而不是调用 Release 的位置。例如,您可能正在调用GetIntArrayElements,但在完成后未能调用ReleaseIntArrayElements

    【讨论】:

    • 我交叉检查了我的 JNI 代码,它似乎是正确的,APP 仍然崩溃,但我之前没有遇到过这个错误。
    【解决方案5】:

    可能是问题所在,您的应用程序可能在 native code 内的某个地方崩溃,这会突然停止您的应用程序而没有任何消息,并且在 Logcat 中没有打印任何内容。

    我遇到了同样的问题,在尝试解码一些 bitmaps 时,android 在 native code 内的某个地方崩溃了,应用程序停止了,没有显示任何消息。

    关于onLowMemory()@Tom 的回答涵盖了它。

    【讨论】:

    • 我如何发现它们在本机代码中出现了一些崩溃?你是怎么做到的?
    • 我真的不知道如何调试本机代码...我认为您需要从本机代码添加一些日志。我,我刚刚在 logcat 中看到了一些奇怪的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多