JNI从C ++调用Java方法

时间:2011-10-22 17:17:59

标签: android methods java-native-interface

我遇到了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()也不会被调用。程序会踩踏一两秒,然后继续。我不确定发生了什么。

有人可以帮助我吗?

非常感谢。

1 个答案:

答案 0 :(得分:5)

您无法将env指针传递给其他线程。您需要将该线程加入JVM。

在原始线程中,名为GetJavaVM以获取JavaVM指针:

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

然后在另一个线程中,将VM附加到该线程并获得一个新的env指针:

vm->AttachCurrentThread(&env, 0);