Android JNI从C++; 我有一个JNI问题,从C++调用java的方法。< /P>

Android JNI从C++; 我有一个JNI问题,从C++调用java的方法。< /P>,android,methods,java-native-interface,Android,Methods,Java Native Interface,我试图调用一个采用布尔值的void方法。我的java代码如下所示: public void setStatus(boolean bool) { // Do stuff... } public native void initialize(int defaultPort); 在我的C++代码中,我正在构造一个结构来保存Env和对象并将其传递给线程: JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initiali

我试图调用一个采用布尔值的void方法。我的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方法,如下所示:

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);
vm->AttachCurrentThread(&env, 0);
然后在另一个线程中,将VM连接到该线程并获取一个新的
env
指针:

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

谢谢!成功了!我必须做两个微小的修改:env->GetJavaVM(&vm);和vm->AttachCurrentThread(&env,0);谢谢!你帮了大忙!事实上,我有一个小问题。有时AttachCurrentThread会使我的代码崩溃。它给了我一个SIGSEGV:I/DEBUG(4633):信号11(SIGSEGV),故障地址00000010我已经添加了一个检查以确保vm!=空,但这没有帮助。有什么线索吗?地址00000010意味着从NULL跳到偏移量。尝试从线程中记录vm指针的值,当出现问题时,它可能为空。感谢您的帮助,我已经修复了它。我调用了free(data),但是线程不会读取void*arg的内容,所以它会尝试读取空指针。我刚刚删除了免费的。非常感谢。