Я использовал 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;
}
}
}