JNI String return value
c++, java, java-native-interface, string
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 a `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 the code as is, seems fine so far.
Although, there are two possible error sources.
The first one is the method signature. Try `"()Ljava/lang/String;"` instead of `"(Ljava/lang/Object;)Ljava/lang/String;"`.
The second one is in the java source itself. If the java method returns a null string, `CallObjectMethod()` will return a NULL `jstring` and `GetStringUTFChars()` fails.
Add a
if (returnString == NULL)
return NULL;
after `CallObjectMethod()`.
So look into the java source and see, whether the method `getDESCDiagLayer()` might return a null string.
Problem
I have a Java instance method which returns a String and I'm calling this method through JNI in C++. I have written 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 the string and convert it to a const char *? My program crashes on the last line with access violation to 0x00000000. returnString is not NULL.