he visto este método cuando una llamada JNI código Java (en mi caso, el método no era estático). Según tengo entendido, las referencias locales no utilizados son no borrado automáticamente cuando un método Java se llama desde JNI (quiero decir, hasta que la función JNI de nivel superior devoluciones).
IIRC bien ya existía información acerca de los objetos de memoria en el registro, o yo podría añadir un poco de registro; de esa información identifiqué elementos de basura que no mencioné antes. Eran dos matrices y una clase, creadas en llamadas posteriores pero no recogidas.
// 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
Tenga en cuenta que aunque estas tres referencias locales se obtuvieron de manera diferente, todas estaban dando vueltas.
Enlace de interés: http://www.netmite.com/android/mydroid/dalvik/docs/jni-tips.html#local_vs_global_references (o encontrar la máquina virtual Dalvik Dalvik docs/docs/JNI-tips.html y localizar la sección "Referencias local frente Global")
cada objeto que devuelve es una JNI "referencia local". Esto significa que es válido por la duración del método nativo actual en el hilo actual. Incluso si el objeto en sí continúa vivo después de que el método nativo retorna, la referencia no es válida. Esto se aplica a todas las subclases de jobject, incluidos jclass y jarray. [...] Nota: el método y los ID de campo son solo identificadores de 32 bits, no referencias de objeto, y no deben pasarse a NewGlobalRef. Los punteros de datos sin formato devueltos por funciones como GetStringUTFChars y GetByteArrayElements tampoco son objetos.
¿Estás seguro de que este es el código que llena tu tabla de referencias? ¿El problema desaparece cuando usas un pJNIData codificado constante? –
@vtmarvin No estoy seguro. ¿Esto hace una diferencia en la tabla de referencia? -> JNIEnv * pJNIEnv = profilerGetJNIEnv(); si (pJNIEnv!) \t \t { \t \t \t LOGE ("Profiler ERROR: entorno Java de falta (nulo)"); \t \t \t return; \t \t} –