【问题标题】:JNI overflow when hashmap > 512当 hashmap > 512 时 JNI 溢出
【发布时间】:2011-04-25 01:04:21
【问题描述】:

使用资源文件,我创建了一个大哈希图

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 充满了类似的记录 "Sleep@Better 每天睡 6 小时以上"

但是,我尝试了一个大(约 1000 项)dual_strings.xml 文件,应用程序在启动后立即崩溃。 查看 LogCag “dalvikvm 添加到 JNI 本地引用表失败(有 512 个条目)”

我可以做些什么来从我的长资源文件中创建和使用大哈希? 谢谢

【问题讨论】:

    标签: android java-native-interface hashmap overflow


    【解决方案1】:

    这看起来像是 Android 的 getStringArrayResources 原生代码中的一个错误。我发现已经提交了一个错误。在本机代码中很容易看出这种情况的原因(在循环中创建了引用,但没有清理)。

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

    现在,您必须解决这个错误。您必须将字符串数组拆分为小于 500 个字符串的小块,或者编写您自己的自定义字符串数组加载方法。也许其他人可以提出更好的解决方案。

    【讨论】:

    • 谢谢。但是,当我将哈希键提供给 AutoCompleteTextView 适配器时,我无法拆分成更小的块。链接说问题已经用 android 2.3 修复了,我会试试这个。我想知道谷歌对 android bug 的政策是什么,比如这个:
    • 如果您上面帖子中的代码表明您在做什么,您应该能够将资源文件拆分为多个资源。您正在构建一个传递适配器的哈希表,因此只需从 2 或 3 个不同的资源文件中通过 2 或 3 次传递来构建适配器。是 getStringArray 方法因太多项目而崩溃,而不是适配器代码。
    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多