问题描述
我制作了一个仅使用NFC读取数据并在修改后写回数据的应用程序。点击卡约100次后,newIntent没有被注册,我在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库,并且没有本机代码。以前,我在具有本机代码的项目中使用了相同的代码,但遇到了相同的错误。堆栈溢出中的许多答案表明,这可能是由于我们没有清除本地引用而导致的本机代码,因此我在单独的项目中仅尝试了NFC操作,而没有任何其他代码。仍然出现相同的错误。
解决方法
我的想法是,因为您似乎不太正确地使用nfcAdapter.enableForegroundDispatch
,所以您将其用完了引用。
您正在onResume
中启用ForegroundDispatch,并且当检测到卡时,您的App会暂停,然后再次恢复,在其中添加了第二个引用,因为第一个引用从未像在{{1}中那样被丢弃}您应用程序的方法。
说
必须从主线程调用此方法,并且仅在活动处于前台(继续)时才调用。另外,活动必须在其Activity#onPause回调完成之前调用disableForegroundDispatch(Activity),以在启用前景后禁用前景分派。
您的代码从不调用enableForegroundDispatch
,因此将方法添加到MainActivity
disableForegroundDispatch(Activity)
或者使用更好的@Override
protected void onPause() {
nfcAdapter.disableForegroundDispatch(this);
}
API https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.os.Bundle)