2011-10-22 87 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