java - JNI - 线程和作业的问题

标签 java c++ dll jvm java-native-interface

我调用了一个本地程序,它创建了另一个线程,该线程将自身附加到 JVM。现在我想访问 JVM 的方法,但它失败了。代码如下:

//
// This is the native function that gets called first. 
// it creates another thread which runs, and also calls the printing-methods in my
// java applet. 
//
JNIEXPORT void JNICALL Java_EIGC_1Applet_app_1native_native_1start(JNIEnv* jenv, jobject job) {

    printAppletConsole(jenv,job,"unused atm");
    // save current java VM;
    // save main applet class;
    // used by main thread
    jenv->GetJavaVM(&applet_java_jvm);
    m_job = job;


    // create the working and start it
    applet_thread_main = new EIGC_Applet_thread(&main);
    applet_thread_main->start();
}


//
// This is the running thread that was created
// This will run and call the printing method in the applet
//
unsigned __stdcall main(void* args) {
    // The JNIEnv
    JNIEnv* jenv = new JNIEnv();

    // attach thread to running JVM
    applet_java_jvm->AttachCurrentThread((void**)jenv,NULL);

    // main running loop
    while (true) {
         Sleep(1000);
         printAppletConsole(jenv,m_job,"unused");
    }

    applet_thread_main->stop();
    return 0;
    }


//
// Calls the "writeConsole()" method in applet which prints "test" in a JTextArea
//
void printAppletConsole(JNIEnv* jenv,jobject job,char* text) {
    jclass cls = jenv->GetObjectClass(job);
    jmethodID mid = jenv->GetMethodID(cls,"writeConsole","()V");
    if (mid==NULL) { 
            printf("Method not found");
    }
    else {
        jenv->CallVoidMethod(job,mid);
    }
}

我有一个问题;

1) 在新创建的线程中,当我尝试调用 printAppletConsole 时,JVM 只是挂起,它卡在 GetObjectClass() 上。这是为什么呢?

我的怀疑是,由于我创建了一个新线程,我需要访问一个新的 jobject 实例,但我不确定如何..

谢谢!

最佳答案

m_job = job;

这只是保留本地引用,一旦您返回 java 就无效。您需要使用 NewGlobalRef 创建一个全局引用并存储它。

JNIEnv* jenv = new JNIEnv();
applet_java_jvm->AttachCurrentThread((void**)jenv,NULL);

应该是:

JNIEnv* jenv = 0:
applet_java_jvm->AttachCurrentThread(&jenv,NULL);

编辑:对于较旧的 JNI 版本,请使用:

JNIEnv* jenv = 0:
applet_java_jvm->AttachCurrentThread((void **) &jenv,NULL);

关于java - JNI - 线程和作业的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5460554/

相关文章:

java - 为什么Java加密AES填充我的16字节纯文本消息?

java - 将Firebase Auth从版本9.6.1更新到9.8.0时的java.lang.IllegalAccessError

c++ - 将 Qt GUI 添加到动态库

c++ - 如何在 C++ 中编写简短的文字?

c# - 在C#项目中使用C++ dll函数提高性能

c++ - C++ DLL : static variable initialization problem的制作

c++ - CreateRemoteThread、LoadLibrary 和 PostThreadMessage。什么是正确的 IPC 方法?

java - SwingUtilities.invokeLater,SwingWorker和gif图标动画问题

java - Firefox Profile 无法自动下载文件

c++ - 在特里释放指针