сбой в jni GetStringUTFChars - PullRequest
       1

сбой в jni GetStringUTFChars

0 голосов
/ 18 марта 2019

приложение для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...