static char destination[33] = {0}; // add one more byte for null-terminator
char* dstptr = destination; // pointer to first char of the static buffer
for (i = 0; i < 16; i++) {
sprintf(dstptr, "%02x", dest[i]&0xFF); // overwrite two chars in buffer
dstptr += 2; // advance pointer
}
Таким образом, он будет каждый раз перезаписывать 32 символа, не заботясь о старом контенте.
Имейте в виду, что это похоже на некоторую функцию поддержки для кода Android, что если два потока вызывают его одновременно для получения результата используется один и тот же буфер stati c, поэтому вы можете получить поврежденный ответ в обоих ответах (частичный ответ за один вызов смешивается с частью второго). Так что это не потокобезопасно.
Плюс следующий вызов функции сделает недействительной предыдущую версию (если вы сохраняете только указатель на результат и не скопировали его в Java String).
Я бы, вероятно, предложил вместо этого возвращать только что инстанцированную jstring для непосредственного использования верхним Android кодом (плюс это может быть возможно потокобезопасно, потому что все другие экземпляры в вашем коде являются локальными переменными, только destination
is stati c, поэтому, если сами функции MD5 поточно-ориентированы и вы избавитесь от destination
, вы сделаете всю функцию поточно-безопасной). Не добавляя исходный пример этого, потому что JNI, как правило, ужасная боль для меня, убивая все хорошее в C ++ и пропагандируя все плохое в нем, очень склонный к ошибкам и потерям типов, et c ... (мой личный токси c предвзятость - игнорируйте, если вы не заинтересованы в разговоре sh, - что он был специально разработан таким образом, чтобы избежать слишком большого использования C / C ++ вместе с Java, но опять же, это было сделано так много лет назад, до C ++ 11, так что, может быть, люди, разрабатывающие Java, были не в курсе ... на самом деле это имеет больше смысла, учитывая весь язык Java)