使用JNI从C ++调用方法时,CallStaticObjectMethod始终返回null

时间:2018-04-27 15:52:59

标签: java c++ java-native-interface

我有一个JAR库,其中包含一些我想用于C ++项目的方法。我正在使用JNI来调用该方法。我能够调用静态方法并将参数传递给它没有问题。但是,当我尝试使用从Java返回字符串的方法时,我根本无法获得字符串返回。

Java方法:

public static String receiveAckMessage() {
    try {
            in.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        receivedMessage = new String(buffer);
    return receivedMessage;
}

在C ++项目中,我用以下方法调用了Java方法:

JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
jclass cls = env->FindClass("SendMessage");
            if (cls == nullptr) {
                printf("ERROR: class not found!\n");
            }
            else {
                jmethodID meth = env->GetStaticMethodID(cls, "receiveAckMessage", "()Ljava/lang/String;");
                if (meth != nullptr) {
                    jstring strs = (jstring)env->CallStaticObjectMethod(cls, meth);
                    if (strs != NULL) {
                        const char *strReturn = env->GetStringUTFChars(strs, JNI_FALSE);
                        printf("String: %s\n", strReturn);
                   }
                   else printf("Cannot get return value.\n");
                }
                else {
                    printf("Method not found!\n");
                }
            }

此时CallStaticObjectMethod总是返回NULL,我无法通过它。我也尝试return "Hello World"而不是来自socket的消息,但结果仍然相同。从Java代码返回的String对象始终为null。

所以我的问题是如何从上面的Java方法中获取字符串返回?

非常感谢您的时间和帮助。

0 个答案:

没有答案