Android 什么会导致jni引用内存问题?一些详细的问题

Android 什么会导致jni引用内存问题?一些详细的问题,android,memory,reference,java-native-interface,Android,Memory,Reference,Java Native Interface,我最近开始着手一个Android项目,通过JNI进行本机调用。我已经了解了关于本机调用可以创建的引用数量的限制。我想深入了解参考咨询管理的工作原理。我研究了一些信息,但仍然有一些问题我想知道答案。不言而喻: 本机代码中的哪种引用会导致超出这些内存限制?哪些计入限额,哪些不计入限额?他们中的一些人这样做而其他人不这样做的原因是什么 a) jclass、jobject、jmethodID、jfieldID(以及我没有提到的任何其他) b) 本地参考?全球参考?也许两者都有。如果两者都有,那么每种类

我最近开始着手一个Android项目,通过JNI进行本机调用。我已经了解了关于本机调用可以创建的引用数量的限制。我想深入了解参考咨询管理的工作原理。我研究了一些信息,但仍然有一些问题我想知道答案。不言而喻:


  • 本机代码中的哪种引用会导致超出这些内存限制?哪些计入限额,哪些不计入限额?他们中的一些人这样做而其他人不这样做的原因是什么
  • a) jclass、jobject、jmethodID、jfieldID(以及我没有提到的任何其他)

    b) 本地参考?全球参考?也许两者都有。如果两者都有,那么每种类型的限制是分开的还是共享的


  • 根据[1]“实现只需要为16个本地引用保留插槽”
  • a) 它指的是哪个“实施”?是安装在设备上的JVM实现吗?还是JNI库的实现?如果我理解正确,第一个选项意味着我永远无法确定我的代码(例如,同时使用17个本地引用)是否会在所有设备上运行。但是(仍然是IIUC),如果它是第二个选项,那么使用相同JNI库编译的代码将始终以相同的方式运行,而不管设备如何

    b) 在调查各种论坛时,我遇到了不同最大表大小的帖子,我看到的最小值是512。我(大致)看到小于512的表格的可能性有多大?你认为我应该期望的平均尺寸是多少

    c) 有没有办法查询/增加这些表的大小?分配/取消分配新的


    非常感谢您抽出时间


    [1] A
    jmethodID
    jfieldID
    不是参考。调用
    JNIEnv
    中的一个函数得到的任何
    jclass
    jobject
    通常都是本地引用(除了一些明显的例外,如
    NewGlobalRef
    )。关于本地参考表的限制,请参阅JNI函数文档中的
    EnsureLocalCapacity
    。感谢您为我指出此函数。您知道是否有任何等价物可确保全球参考表容量?文档中没有提到这一点。全局参考限值应该要高得多。您可能同时拥有数千个。所以,如果你开始接近极限,老实说,你可能做错了什么。是的,我不打算:P我只是想对这些参考资料有一个深入的了解。就我所见,JNI文档中没有提到会查询/更改全局引用容量的函数。我看到的所有关于超出全局引用限制的错误都提到了该表的50.000+大小。A
    jmethodID
    jfieldID
    不是引用。调用
    JNIEnv
    中的一个函数得到的任何
    jclass
    jobject
    通常都是本地引用(除了一些明显的例外,如
    NewGlobalRef
    )。关于本地参考表的限制,请参阅JNI函数文档中的
    EnsureLocalCapacity
    。感谢您为我指出此函数。您知道是否有任何等价物可确保全球参考表容量?文档中没有提到这一点。全局参考限值应该要高得多。您可能同时拥有数千个。所以,如果你开始接近极限,老实说,你可能做错了什么。是的,我不打算:P我只是想对这些参考资料有一个深入的了解。就我所见,JNI文档中没有提到会查询/更改全局引用容量的函数。我看到的所有关于超出全局引用限制的错误都提到了该表的50.000+大小。