Java – JNI string return value

I have a Java instance method that returns a string. I call this method through JNI in C I wrote the following code:

const char *DiagLayerContainer_getDESC(jnienv *env,jobject diagLayer) {
    jclass diagLayerClass = env->FindClass(PARSER_CLASS);
    jmethodID getDESCDiagLayerMethodID = env->getmethodID(diagLayerClass,"getDESCDiagLayer","(Ljava/lang/Object;)Ljava/lang/String;");
    jstring returnString = (jstring) env->CallObjectMethod(diagLayer,getDESCDiagLayerMethodID);
    return env->GetStringUTFChars(returnString,JNI_FALSE);
}

How do I get a string and convert it to const char *?

My program crashed on the last line with an access violation of 0x00000000 Returnstring is not null

Solution

According to getstringutfchars, the last parameter is a pointer to jboolean

change

return env->GetStringUTFChars(returnString,JNI_FALSE);

to

return env->GetStringUTFChars(returnString,NULL);

Or better yet, return an STD:: string

std::string DiagLayerContainer_getDESC(...) {
    ...
    const char *js = env->GetStringUTFChars(returnString,NULL);
    std::string cs(js);
    env->ReleaseStringUTFChars(returnString,js);
    return cs;
}

I've built a similar simple example and code, which seems good so far

Although, there are two possible sources of error

The first is method signature Try "() ljava / Lang / string;" Instead of "(ljava / Lang / object;) Ljava / lang / String;”.

The second is the Java source code itself If the Java method returns an empty string, callobjectmethod() will return null jstring and getstringutfchars() will fail

Add a

if (returnString == NULL)
    return NULL;

After callobjectmethod()

So check the Java source code to see if the method getdescdiaglayer () can return an empty string

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>