FindClass desde cualquier hilo en Android JNI

La página de consejos JNI de Android menciona esto.Preguntas frecuentes: ¿Por qué FindClass no encontró mi clase? Mencionan múltiples soluciones y la última opción es esta:

Almacene en caché una referencia al objeto ClassLoader en algún lugar a mano y emita llamadas loadClass directamente. Esto requiere un poco de esfuerzo.

Entonces, traté de que funcionara y parece que no importa qué, este método simplemente no funciona para mí. Finalmente, me di cuenta de cómo usar ClassLoader, pero no funcionará si desde un hilo nativo intento cargar una clase que no ha sido tocado / cargado todavía. Esencialmente, es idéntico a env-> FindClass en el comportamiento cuando se llama desde un hilo nativo, con la excepción de que no devolverá 0 para las clases que ya se usaron en la aplicación. Cualquier idea de si no lo hice bien, o es imposible acceder a las clases desde un hilo nativo que aún no se usó / cargó.






EDITAR: Daré más información para explicar a qué me refiero exactamente. Hay JNI regularenv->FindClass(className), y otra que escribí.myFindClass(env, className) que usa cachéClassLoader->loadClass.

La clase a la que estoy tratando de acceder desde c / c ++ nativo es "com / noname / TestClient". Dentro de myFindClass también uso env-> FindClass y registro el valor que devuelve:

jclass myFindClass(JNIEnv * env, const char* name)
{
    ...
    jclass c0 = env->FindClass(name);
    jclass c1 = (jclass)env->CallObjectMethod(ClassLoader,
        MID_loadClass, envNewStringUTF(name));
    dlog("myFindClass(\"%s\") => c0:%p, c1:%p, c0 and c1 are same: %d",
        name, c0, c1, env->IsSameObject(c0, c1));
    ...
}

Entonces, tengo estas 3 combinaciones para explicar el problema.

1)

//inside JNI_OnLoad thread
myFindClass(env, "com/noname/TestClient");
...

//inside native thread created by pthread_create
myFindClass(env, "com/noname/TestClient");

Me sale este logcat:

myFindClass ("com / noname / TestClent") => c0: 0x41b64558, c1: 0x41b64558, c0 y c1 son iguales: 1
...
myFindClass ("com / noname / TestClent") => c0: 0, c1: 0x41b64558, c0 y c1 son iguales: 0

2)

//inside JNI_OnLoad thread
env->FindClass("com/noname/TestClient");
...

//inside native thread created by pthread_create
myFindClass("com/noname/TestClient");

Me sale este logcat:

myFindClass ("com / noname / TestClent") => c0: 0, c1: 0x41b64558, c0 y c1 son iguales: 0

3)

//inside JNI_OnLoad thread
//"com/noname/TestClient" isn't touched from JNI_OnLoad.
...

//inside native thread created by pthread_create
myFindClass(env, "com/noname/TestClient");

Me sale este logcat:

myFindClass ("com / noname / TestClent") => c0: 0, c1: 0, c0 y c1 son iguales: 1

Básicamente, mi problema es que ClassLoader no encuentra mi clase en el tercer caso. ¿Es un error? ¿Qué se puede hacer para solucionar el problema?

EDIT2: Además de eso, parece que ClassLoader :: loadClass es simplemente buggy. Si le pregunto a myFindClass ("noname / TestClent"), entonces devuelve algo de basura, y cuando uso esa clase jclass devuelta de alguna manera, la aplicación falla.

Respuestas a la pregunta(2)

Su respuesta a la pregunta