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()也不會被調用。程序踩了一兩秒鐘,然後繼續。我不確定發生了什麼事。
任何人都可以幫我嗎?
非常感謝。
謝謝很多!這工作!我必須做兩個微小的修改:env-> GetJavaVM(&vm);和vm-> AttachCurrentThread(&env,0);非常感謝!你幫了很多! – Jary
實際上,我有一個小問題,有時AttachCurrentThread崩潰我的代碼。它給了我一個SIGSEGV:I/DEBUG(4633):signal 11(SIGSEGV),fault addr 00000010 – Jary
我已經添加了一個檢查以確保vm!= NULL但是沒有幫助,請提供任何線索嗎? – Jary