我遇到了JNI的问题,调用从C ++到Java的方法。
我试图调用一个带有布尔值的void方法。我的java代码如下:
public void setStatus(boolean bool) {
// Do stuff...
}
public native void initialize(int defaultPort);
在我的C ++代码中,我正在创建一个结构来保存env和object并将其传递给一个线程:
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方法,如下所示:
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进行调试。我已经尝试在setStatus()中在Eclipse中放置一个断点但它永远不会被调用。 exit()也不会被调用。程序会踩踏一两秒,然后继续。我不确定发生了什么。
有人可以帮助我吗?
非常感谢。
答案 0 :(得分:5)
您无法将env指针传递给其他线程。您需要将该线程加入JVM。
在原始线程中,名为GetJavaVM
以获取JavaVM
指针:
JavaVM *vm = 0;
env->GetJavaVM(&vm);
然后在另一个线程中,将VM附加到该线程并获得一个新的env
指针:
vm->AttachCurrentThread(&env, 0);