在JNI后台线程中查找类时出现ClassNotFoundException

Eri*_*wne 5 java-native-interface android classloader

当我尝试在我的C++代码中的后台线程上创建一个ArrayList时,我的Android应用程序给了我一个ClassNotFoundException.

在JNI_OnLoad()中,我将我的类加载器放在一边:

jclass clsMine = env->FindClass("com/mypackage/MyClass");
jclass classClass = env->GetObjectClass(clsMine);
jclass classLoaderClass = env->FindClass("java/lang/ClassLoader");
jmethodID getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
gClassLoader = env->NewGlobalRef(env->CallObjectMethod(clsMine, getClassLoaderMethod));
gFindClassMethod = env->GetMethodID(classLoaderClass, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
Run Code Online (Sandbox Code Playgroud)

我有一个findClass()方法,我可以从其他线程调用:

static jclass findClass(JNIEnv* env, const char* name)
{
    return static_cast<jclass>(env->CallObjectMethod(gClassLoader, gFindClassMethod, env->NewStringUTF(name)));
}
Run Code Online (Sandbox Code Playgroud)

我可以使用它来访问MyClass及其内部类和接口.但是当我尝试创建一个ArrayList时,我的findClass()会抛出一个ClassNotFoundException.

我意识到,如果我的Java代码在加载本机库之前创建了一个ArrayList,那么我就不会得到异常.或者如果我env->FindClass("java/util/ArrayList")在JNI_OnLoad()中,那么我没有得到异常.但这些都是解决方法.为什么我不能使用我隐藏的类加载器创建Java类?或者我应该使用不同的类加载器?

编辑:

并且为了增加皱纹,在ART下,我env->FindClass("java/util/ArrayList")在JNI_OnLoad()中调用的解决方法不起作用.