Переполнение JNI при хэш-карте > 512

#android #java-native-interface #hashmap #overflow

#Android #java-родной интерфейс #hashmap #переполнение

Вопрос:

Используя файл ресурсов, я создаю большую hashmap

 HashMap<String, String> bigHash = new HashMap<String, String>();
public void createHash(){
    String [] items = getResources().getStringArray(R.array.dual_strings);
    String [] temp;
    for ( String s : items ){
        temp = s.split("@");
        bigHash.put(temp[0],temp[1]);
    }
}
  

dual_string.xml полно записей, таких как
«Спи @Лучше спать более 6 часов в день»

Тем не менее, я пробовал с большим (~ 1000 элементов) dual_strings.xml файл и приложение выходят из строя сразу после запуска. Просматриваю LogCag «dalvikvm не удалось добавить в локальную таблицу ссылок JNI (содержит 512 записей)»

Могу ли я что-нибудь сделать, чтобы создать и использовать большой хэш из моего длинного файла ресурсов? Спасибо

Ответ №1:

Это похоже на ошибку в собственном коде Android для getStringArrayResources. Я обнаружил, что в этом уже есть ошибка. Легко увидеть причину этого в машинном коде (ссылка создается в цикле, но не очищается).

http://code.google.com/p/android/issues/detail?id=5287amp;q=getArrayStringResourceamp;colspec=ID Type Status Owner Summary Stars

На данный момент вам придется обойти эту ошибку. Вам придется разбить ваш массив строк на более мелкие фрагменты по <500 строк в каждом или написать свой собственный метод загрузки массива строк. Возможно, кто-то другой может предложить более приятное решение.

Комментарии:

1. Спасибо. Однако я не могу разделить на более мелкие фрагменты, поскольку я передаю хэш-ключи в адаптер AutoCompleteTextView. Ссылка говорит, что проблема была исправлена с Android 2.3, я попробую это. Интересно, какова политика Google в отношении таких ошибок Android, как эта: < версия 2.3 когда-нибудь будет исправлена?

2. Если код в вашем сообщении выше указывает на то, что вы делаете, вы должны иметь возможность разделить файл ресурсов на несколько ресурсов. Вы создаете хэш-таблицу, которую передаете адаптеру, поэтому просто создайте адаптер за 2 или 3 прохода из 2 или 3 разных файлов ресурсов. Сбой происходит из-за слишком большого количества элементов в методе getStringArray, а не из-за кода адаптера.