当JNI方法称为Java代码时(我的情况下,该方法不是静态的),我已经看到了这一点.据我所知,当从JNI调用Java方法时,不会自动删除未使用的本地引用(我的意思是,直到顶级JNI函数返回).
IIRC或者已经有关于日志中内存对象的信息,或者我可以添加一些日志记录;根据这些信息,我发现了之前没有提到的垃圾.它们是两个数组和一个类,在后续调用中创建但不是垃圾回收.
// in a function that calls a Java method from JNI
jbyteArray srcArray = env->NewByteArray(len);
jclass cls = env->FindClass("com/something/MyClass");
jmethodID mid = env->GetMethodID(cls, "mymethod", "([BI)[B");
jbyteArray resArray = (jbyteArray)env->CallObjectMethod(obj, mid, srcArray, XXXX);
...
env->DeleteLocalRef(cls);
env->DeleteLocalRef(resArray);
env->DeleteLocalRef(srcArray);
// no need to do anything with mid
请注意,虽然这三个本地参考文献的获得方式不同,但它们都是闲置的.
JNI返回的每个对象都是“本地引用”.这意味着它在当前线程中当前本机方法的持续时间内有效.即使在本机方法返回后对象本身继续存在,引用也无效.这适用于jobject的所有子类,包括jclass和jarray. […]注意:方法和字段ID只是32位标识符,而不是对象引用,不应传递给NewGlobalRef. GetStringUTFChars和GetByteArrayElements等函数返回的原始数据指针也不是对象.