«Обнаружено повреждение кучи», когда я объединяю строки в JNI - PullRequest
0 голосов
/ 30 марта 2020

Я использовал JNI для конкатенации подобных строк и получил APP cra sh error: «повреждение кучи обнаружено dlmalloc_real», компилятор сказал мне, что есть проблема с кучей памяти. Я новичок ie, и я не знаю, правильно ли я использую JNI для конкатенации. Я другой получу эту ошибку, когда +1 или не +1 при выделении блока памяти char. Эта ошибка напрямую вызвала мое приложение к sh, и журнал ошибок не мог отследить. Я получил только одно: 'повреждение кучи, обнаруженное dlmalloc_real'. Эта ошибка в настоящее время появляется только на Android 5.x. Другие версии не нашли эту ошибку. Поэтому я хочу знать, является ли мой JNI для объединения строк сшивания неправильным.

это мой код оригинальный снимок экрана , значение re возвращается непосредственно в слой JAVA в конец.

    const char *username = (*env)->GetStringUTFChars(env, user_name, NULL);
    const char *password = (*env)->GetStringUTFChars(env, pass_word, NULL);
    const char *http = "thi is a string***";
    const char *pas = "*thi is a string****";
    const char *httpTail = "thi is a string***";
    char *host = (char *) malloc(
            strlen(http) + strlen(username) +strlen(pas) + strlen(password) + strlen(httpTail)+1);
    strcat(host, http);
    strcat(host, username);
    strcat(host, pas);
    strcat(host, password);
    strcat(host, httpTail);
    correctUtfBytes(host);
    (*env)->ReleaseStringUTFChars(env, user_name, username);
    (*env)->ReleaseStringUTFChars(env, pass_word, password);
    jstring re = (*env)->NewStringUTF(env, host);
    return re;

Этот метод только проверяет, соответствует ли кодировка формату C. Если обнаружение и преобразование не выполняется, функция newstringutf может сообщить об ошибке, что формат кодирования не соответствует, потому что строка Java и кодировка символов C отличаются

void correctUtfBytes(char *bytes) {
    char three = 0;
    while (*bytes != '\0') {
        unsigned char utf8 = *(bytes++);
        three = 0;
        // Switch on the high four bits.
        switch (utf8 >> 4) {
            case 0x00:
            case 0x01:
            case 0x02:
            case 0x03:
            case 0x04:
            case 0x05:
            case 0x06:
            case 0x07:
                // Bit pattern 0xxx. No need for any extra bytes.
                break;
            case 0x08:
            case 0x09:
            case 0x0a:
            case 0x0b:
            case 0x0f:
                /*
                 * Bit pattern 10xx or 1111, which are illegal start bytes.
                 * Note: 1111 is valid for normal UTF-8, but not the
                 * modified UTF-8 used here.
                 */
                *(bytes - 1) = '?';
                break;
            case 0x0e:
                // Bit pattern 1110, so there are two additional bytes.
                utf8 = *(bytes++);
                if ((utf8 & 0xc0) != 0x80) {
                    --bytes;
                    *(bytes - 1) = '?';
                    break;
                }
                three = 1;
                // Fall through to take care of the final byte.
            case 0x0c:
            case 0x0d:
                // Bit pattern 110x, so there is one additional byte.
                utf8 = *(bytes++);
                if ((utf8 & 0xc0) != 0x80) {
                    --bytes;
                    if (three)--bytes;
                    *(bytes - 1) = '?';
                }
                break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...