首页 > 解决方案 > E/dalvikvm: JNI ERROR (app bug): local reference table overflow (max=512)

问题描述

我制作了一个应用程序,它只需使用 NFC 读取数据并在修改后写回数据。敲卡大约 100 次后,新意图没有被注册,我在 logcat 中得到了这个

01-01 05:43:46.990 6347-6376/? E/dalvikvm: JNI ERROR (app bug): local reference table overflow (max=512)
01-01 05:43:46.990 6347-6376/? E/dalvikvm: Failed adding to JNI local ref table (has 512 entries)
01-01 05:43:46.990 6347-6376/? E/dalvikvm: VM aborting
01-01 05:43:46.990 6347-6376/? A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 6376 (message)
01-01 05:43:48.010 9950-9950/com.android.nfc E/Trace: error opening trace file: No such file or directory (2)
01-01 05:43:49.930 9950-9971/com.android.nfc E/NFC-HCI: Could not open /system/vendor/firmware/libpn544_fw.so

它与dalvikvm有关吗?因为我在运行 android 9.1 的新手机中没有收到此错误。到目前为止,该问题仅在运行 4.2 的设备中出现。

我正在使用默认的 NFC 库,并且没有本机代码。以前我在带有本机代码的项目中使用相同的代码,我得到了同样的错误。Stack overflow 中的许多答案表明这可能是由于我们没有清除本地引用的本机代码,所以我只在单独的项目中尝试了 NFC 操作,没有任何其他代码。仍然得到同样的错误。

标签: androidnfcdalvikandroid-4.2-jelly-bean

解决方案


我的想法是,因为您似乎没有nfcAdapter.enableForegroundDispatch完全正确地使用它,所以您将其用尽了参考。

您正在启用 ForegroundDispatchonResume并且当检测到卡时,您的应用程序被暂停,然后再次恢复,它添加了第二个引用,因为第一个引用从未被处理掉,因为它应该在onPause您的应用程序的方法中。

enableForegroundDispatch 来自https://developer.android.com/reference/android/nfc/NfcAdapter#enableForegroundDispatch(android.app.Activity,%20android.app.PendingIntent,%20android.content.IntentFilter[],%20java.lang的文档。细绳[][])

必须从主线程调用此方法,并且仅当活动处于前台(恢复)时。此外,活动必须在其 Activity#onPause 回调完成之前调用 disableForegroundDispatch(Activity) 以在启用后禁用前台调度。

您的代码从不调用disableForegroundDispatch(Activity),因此将该方法添加到 MainActivity

@Override
protected void onPause() {
   nfcAdapter.disableForegroundDispatch(this);
}

或者使用更好的enableReaderModeAPI https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)


推荐阅读