приложение для Android редко падает, а addr2line
указывает на _JNIEnv::GetStringUTFChars(_jstring*, unsigned char*)
.
функция кода вызывается с ключом, передает ее в функцию java, которая возвращает строку, а затем возвращает ее начальному вызывающему объекту, код выполняется много раз за время существования приложения.
значение, возвращаемое со стороны Java, может быть empty string
, non empty string
и никогда не null
.
в чем может быть проблема? это может быть не utf char
в этой строке? и если да, как я могу справиться с этим?
std::string JNIcalls::Get(std::string key)
{
std::string value = "";
#ifdef __ANDROID__
// retrieve the JNI environment.
JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv();
// retrieve the Java instance of the SDLActivity
jobject activity = (jobject)SDL_AndroidGetActivity();
if (activity == NULL) {
return value;
}
// find the Java class of the activity. It should be SDLActivity or a subclass of it.
jclass clazz(env->GetObjectClass(activity));
if (clazz == NULL) {
env->DeleteLocalRef(activity);
return value;
}
// find the identifier of the method to call
jmethodID method_id = env->GetStaticMethodID(clazz, "ImpJNIcallsGet", "(Ljava/lang/String;)Ljava/lang/String;");
if (method_id == NULL) {
env->DeleteLocalRef(activity);
env->DeleteLocalRef(clazz);
return value;
}
jstring jkey = env->NewStringUTF(key.c_str());
if (jkey == NULL) {
env->DeleteLocalRef(activity);
env->DeleteLocalRef(clazz);
return value;
}
// effectively call the Java method
jstring rv = (jstring)env->CallStaticObjectMethod(clazz, method_id, jkey);
if (rv != NULL) {
const char *strReturn = env->GetStringUTFChars(rv, 0);
int strlen_size = strlen(strReturn);
for (int i = 0; i < strlen_size; i++)
{
value.append(1, strReturn[i]);
}
env->ReleaseStringUTFChars(rv, strReturn);
env->DeleteLocalRef(rv);
}
// clean up the local references.
env->DeleteLocalRef(activity);
env->DeleteLocalRef(clazz);
env->DeleteLocalRef(jkey);
#endif
return value;
}
это код возврата Java:
String returnValue = null;
try {
returnValue = futureResult.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if(returnValue == null) returnValue = "";
return returnValue;