android - 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 操作,没有任何其他代码。仍然得到同样的错误。
解决方案
我的想法是,因为您似乎没有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);
}
或者使用更好的enableReaderMode
API https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)
推荐阅读
- r - 使用 R 语言将 sentinel-2 波段缩小到 10m
- javascript - 无法将属性添加到传单矩形,如何解决此问题?
- javascript - 捕获子窗口占刷新的全局窗口对象
- css - 在本机反应中处理背景颜色半径
- amazon-web-services - 如何每秒触发 5 次 AWS lambda 函数?
- sql - 如何计算列值的出现次数并将其连接到 SQL 中的相同列?
- angular - 通过茉莉花测试Angular中的内部功能
- r - 创建一个基于组和最大值返回最大值的列
- ios - 如何检测用户何时清除通知中心的所有通知
- javascript - CesiumJS 动画从一个位置到另一个位置的移动