【问题标题】:JNI calling a Java Method from C++JNI 从 C++ 调用 Java 方法
【发布时间】:2011-10-22 17:17:59
【问题描述】:

我在使用 JNI 时遇到问题,将方法从 C++ 调用到 Java。

我正在尝试调用一个采用布尔值的 void 方法。我的java代码如下:

public void setStatus(boolean bool) {
    // Do stuff...
}

public native void initialize(int defaultPort);

在我的 C++ 代码中,我正在创建一个结构来保存环境和对象并将其传递给线程:

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

谁能帮帮我?

非常感谢。

【问题讨论】:

    标签: android methods java-native-interface


    【解决方案1】:

    您不能将 env 指针传递给其他线程。您需要将线程加入 JVM。

    在原线程中,调用GetJavaVM获取JavaVM指针:

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

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

    vm->AttachCurrentThread(&env, 0);
    

    【讨论】:

    • 非常感谢!那行得通!我必须做两个微小的修改: env->GetJavaVM(&vm);和 vm->AttachCurrentThread(&env, 0);非常感谢!你帮了大忙!
    • 其实我有点小问题。有时 AttachCurrentThread 会使我的代码崩溃。它给了我一个 SIGSEGV:I/DEBUG(4633):信号 11(SIGSEGV),故障地址 00000010
    • 我添加了一项检查以确保 vm != NULL 但这没有帮助。请问有什么线索吗?
    • 地址 00000010 意味着从 NULL 跳转到偏移量。尝试从线程记录你的 vm 指针的值,当出现问题时它可能为 NULL。
    • 谢谢你的帮助,我真的修好了。我正在调用 free(data) 但线程不会读取 void *arg 的内容,因此它会尝试读取空指针。我刚刚删除了免费的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多