JNI从C++调用Java方法
问题描述:
我遇到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指针传递给其他线程。您需要将该线程连接到JVM。
在原来的线程,称为GetJavaVM
获得JavaVM
指针:在其他线程
JavaVM *vm = 0;
env->GetJavaVM(&vm);
然后,连接虚拟机到该线程,并得到一个新的env
指针:
vm->AttachCurrentThread(&env, 0);
谢谢很多!这工作!我必须做两个微小的修改:env-> GetJavaVM(&vm);和vm-> AttachCurrentThread(&env,0);非常感谢!你帮了很多! – Jary
实际上,我有一个小问题,有时AttachCurrentThread崩溃我的代码。它给了我一个SIGSEGV:I/DEBUG(4633):signal 11(SIGSEGV),fault addr 00000010 – Jary
我已经添加了一个检查以确保vm!= NULL但是没有帮助,请提供任何线索吗? – Jary