FindClass aus einem beliebigen Thread in Android JNI

Auf der JNI-Tipps-Seite für Android wird dies erwähntFAQ: Warum hat FindClass meine Klasse nicht gefunden? Sie erwähnen mehrere Lösungen und die letzte Option gibt es diese:

Zwischenspeichern Sie einen Verweis auf das ClassLoader-Objekt und geben Sie loadClass-Aufrufe direkt aus. Dies erfordert einige Anstrengungen.

Also habe ich versucht, es zum Laufen zu bringen, und es scheint, dass diese Methode für mich einfach nicht funktioniert. Irgendwann habe ich herausgefunden, wie man ClassLoader benutzt, aber es funktioniert nicht, wenn ich von einem nativen Thread aus versuche, eine Klasse zu laden, die noch nicht berührt / geladen wurde. Im Wesentlichen ist es identisch mit dem Verhalten von env-> FindClass, wenn es von einem systemeigenen Thread aufgerufen wird, mit der Ausnahme, dass es für Klassen, die bereits in der App verwendet wurden, nicht 0 zurückgibt. Eine Idee, wenn ich es nicht richtig verstanden habe oder es unmöglich ist, auf Klassen eines nativen Threads zuzugreifen, der noch nicht verwendet / geladen wurde.






BEARBEITEN: Ich gebe weitere Informationen, um zu erklären, was genau ich meine. Es gibt regelmäßige JNIenv->FindClass(className)und eine andere, die ich geschrieben habemyFindClass(env, className) das verwendet zwischengespeichertClassLoader->loadClass.

Die Klasse, auf die ich von nativem c / c ++ aus zugreifen möchte, ist "com / noname / TestClient". In myFindClass verwende ich auch env-> FindClass und den zurückgegebenen Protokollwert:

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));
    ...
}

Dann habe ich diese 3 Kombinationen, um das Problem zu erklären.

1)

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

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

Ich bekomme diesen Logcat:

myFindClass ("com / noname / TestClent") => c0: 0x41b64558, c1: 0x41b64558, c0 und c1 sind gleich: 1
...
myFindClass ("com / noname / TestClent") => c0: 0, c1: 0x41b64558, c0 und c1 sind gleich: 0

2)

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

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

Ich bekomme diesen Logcat:

myFindClass ("com / noname / TestClent") => c0: 0, c1: 0x41b64558, c0 und c1 sind gleich: 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");

Ich bekomme diesen Logcat:

myFindClass ("com / noname / TestClent") => c0: 0, c1: 0, c0 und c1 sind gleich: 1

Grundsätzlich ist mein Problem, dass ClassLoader meine Klasse im 3. Fall nicht findet. Ist es ein Bug? Was kann getan werden, um das Problem zu beheben?

EDIT2: Darüber hinaus scheint es, dass ClassLoader :: loadClass einfach fehlerhaft ist. Wenn ich myFindClass ("noname / TestClent") frage, gibt es etwas Müll zurück, und wenn ich diese zurückgegebene jclass in irgendeiner Weise verwende, stürzt die App ab.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage