FindClass из любой темы в Android JNI

Android»На странице с советами JNI это упоминаетсяFAQ: почему не сделалt FindClass найти мой класс? Они упоминают несколько решений, и последний вариант есть такой:

Кэшируйте ссылку на объект ClassLoader где-нибудь под рукой и выполняйте вызовы loadClass напрямую. Это требует определенных усилий.

Итак, я попытался заставить его работать, и кажется, что несмотря ни на что, этот метод просто не работает для меня. В конце концов я понял, как использовать ClassLoader, но он выигралне работает, если из родного потока я пытаюсь загрузить класс, который нетронут / загружен еще. По сути, этоs идентично env->FindClass в поведении при вызове из собственного потока, за исключением того, что он выигралt возвращает 0 для классов, которые уже были использованы в приложении. Любая идея, если я нене правильно, или этоневозможно получить доступ к классам из собственного потока, который не былТ используется / загружен еще.











РЕДАКТИРОВАТЬ: Ядам больше информации, чтобы объяснить, что именно я имею в виду. Есть регулярный JNIenv->FindClass(className)и еще один, который я написалmyFindClass(env, className) который использует кешируется.ClassLoader->loadClass

Класс, который яя пытаюсь получить доступ из нативного c / c ++ "ком / Noname / TestClient», Внутри myFindClass я также использую env->FindClass и значение журнала, которое он возвращает:

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

Затем у меня есть эти 3 комбинации, чтобы объяснить проблему.

1)

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

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

Я получаю этот logcat:

myFindClass (»ком / Noname / TestClent») => c0: 0x41b64558, c1: 0x41b64558, c0 и c1 одинаковы: 1

...

myFindClass (»ком / Noname / TestClent») => c0: 0, c1: 0x41b64558, c0 и c1 одинаковы: 0

2)

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

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

Я получаю этот logcat:

myFindClass (»ком / Noname / TestClent») => c0: 0, c1: 0x41b64558, c0 и c1 одинаковы: 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");

Я получаю этот logcat:

myFindClass (»ком / Noname / TestClent») => c0: 0, c1: 0, c0 и c1 одинаковы: 1

По сути, моя проблема в том, что ClassLoader нене могу найти мой класс в третьем случае. Это ошибка? Что можно сделать, чтобы решить проблему?

EDIT2: Кроме того, кажется, что ClassLoader :: loadClass явно глючит. Если я спрашиваю myFindClass ("Noname / TestClent») затем он возвращает какую-то фигню, и когда я использую этот возвращенный jclass любым способом, приложение вылетает.

Ответы на вопрос(2)

Ваш ответ на вопрос