Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JNI overflow when hashmap > 512

Using a resource file, I create a big 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 is full of records like "Sleep@Better sleep more than 6 hours a day"

However, I tried with a big (~1000 items) dual_strings.xml file and app crashes immediately after starting. Looking at LogCag "dalvikvm failed adding to JNI local ref table (has 512 entries)"

Is there anything I can do to create and use a big hash from my long resource file? Thanks

like image 684
DrWolf Avatar asked Feb 11 '26 19:02

DrWolf


1 Answers

This looks like a bug in Android's native code for getStringArrayResources. I've found that there's a bug filed on this already. It's easy to see the cause of this in the native code (a reference is created in a loop, but not cleaned up).

http://code.google.com/p/android/issues/detail?id=5287&q=getArrayStringResource&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

For now, you'll have to work around this bug. You'll have to split your array of strings into smaller chunks of <500 strings each, or write your own custom string array loading method. Perhaps someone else can come up with a nicer solution.

like image 140
Jason LeBrun Avatar answered Feb 17 '26 02:02

Jason LeBrun