E / dalvikvm:JNI错误应用程序错误:本地引用表溢出最大值= 512

问题描述

我制作了一个仅使用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}中那样被丢弃}您应用程序的方法。

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

必须从主线程调用此方法,并且仅在活动处于前台(继续)时才调用。另外,活动必须在其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)