2

我想在 pthread 中调用 java 方法。

C++ 方法是这样开始的:

char* FileLoader::getStringFromFile(char* a_filename)
{
   JNIEnv *env;
   g_jvm->AttachCurrentThread (&env, NULL);
   jclass cls = env->FindClass(JAVA_FILE_LOADER_CLASS);
   ...

g_jvm 指向 JavaVM 对象。它是在应用程序启动时在 JNI_OnLoad() 方法中设置的。

当调用“FindClass”时,它会抛出“noClassDefFoundError”,但如果我在主线程中调用此方法,它会按预期工作。

我忘记了什么吗?

4

1 回答 1

2

好的,我通过 technomage 的建议解决了这个问题:

在我的 JNI_OnLoad() 方法中:

jint JNI_OnLoad(JavaVM* vm, void * reserved)
{
    JNITools::g_jvm = vm;

    JNIEnv *env;
    g_jvm->AttachCurrentThread (&env, NULL);jclass tmpClass = env->FindClass("com/Framework/IO/CFileLoader");
    g_fileLoaderClass = (jclass)env->NewGlobalRef(tmpClass);
    ... 

我的第一次测试失败了,因为我忘记调用 NewGlobalRef()。

文档帮助我理解了为什么需要它。

于 2012-10-11T15:09:49.410 回答