2011-10-22 134 views
3

我遇到JNI的问题,调用从C++到Java的方法。JNI从C++调用Java方法

我想调用一个采用布尔值的无效方法。我的Java代码如下:

public void setStatus(boolean bool) { 
    // Do stuff... 
} 

public native void initialize(int defaultPort); 

在我的C++代码,我想提出一个结构来保持env和对象,并把它传递给一个线程:

JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initialize 
    (JNIEnv * env, jobject obj, jint port) 
{ 
    struct javaInfo* data = (struct javaInfo*) malloc(sizeof(struct javaInfo)); 
    data->env = env; 
    data->javaObjHost = obj; 

    pthread_t pth; 
    pthread_create(&pth, NULL, startServer, (void *) data); 

    free(data); 
} 

在实际的功能,我我试图获取类,然后放在methodID,然后调用空方法,如下所示:

void *startServer(void* arg) { 
    struct javaInfo* data = (struct javaInfo*) arg; 
    JNIEnv* env = data->env; 
    jobject javaObjHost = data->javaObjHost; 

    cls = env->GetObjectClass(javaObjHost); 
    mid = env->GetMethodID(cls, "setStatus", "(Z)V"); 
    if (mid == 0) { 
     exit(-1); 
    } 
    env->CallVoidMethod(javaObjHost, mid, true); 
} 

这是我很难用JNI调试。我曾尝试在Eclipse中的setStatus()中放置一个断点,但它永远不会被调用。 exit()也不会被调用。程序踩了一两秒钟,然后继续。我不确定发生了什么事。

任何人都可以帮我吗?

非常感谢。

回答

5

您不能将env指针传递给其他线程。您需要将该线程连接到JVM。

在原来的线程,称为GetJavaVM获得JavaVM指针:在其他线程

JavaVM *vm = 0; 
env->GetJavaVM(&vm); 

然后,连接虚拟机到该线程,并得到一个新的env指针:

vm->AttachCurrentThread(&env, 0); 
+0

谢谢很多!这工作!我必须做两个微小的修改:env-> GetJavaVM(&vm);和vm-> AttachCurrentThread(&env,0);非常感谢!你帮了很多! – Jary

+0

实际上,我有一个小问题,有时AttachCurrentThread崩溃我的代码。它给了我一个SIGSEGV:I/DEBUG(4633):signal 11(SIGSEGV),fault addr 00000010 – Jary

+0

我已经添加了一个检查以确保vm!= NULL但是没有帮助,请提供任何线索吗? – Jary