diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt index 6a597ead..d6fefbdb 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/viewmodel/ChatViewModel.kt @@ -1249,6 +1249,7 @@ class ChatViewModel : ViewModel() { r.sendMessage(ch.id, text) viewModelScope.launch { _messages.value = withContext(Dispatchers.IO) { r.getMessages(ch.id) } + .map { it.copy(feedback = feedbackCache[it.messageId]) } refreshChannels() } } diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index d426e342..685ae281 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -1923,7 +1923,21 @@ JNIEXPORT jstring JNICALL Java_com_utun_chat_data_NativeLib_nativeGetMessages( (void)thiz; const char* ch = (*env)->GetStringUTFChars(env, channelId, NULL); char* json = utun_bridge_get_messages_json(ch, (int)limit); - jstring result = (*env)->NewStringUTF(env, json); + /* String(byte[], UTF-8) корректно восстанавливает четырёхбайтовые emoji. */ + jclass strings = (*env)->FindClass(env, "java/lang/String"); + jmethodID constructor = strings ? (*env)->GetMethodID(env, strings, "", "([BLjava/lang/String;)V") : NULL; + size_t bytes = json ? strlen(json) : 0; + jbyteArray data = (*env)->NewByteArray(env, (jsize)bytes); + jstring charset = (*env)->NewStringUTF(env, "UTF-8"); + jstring result = NULL; + if (constructor && data && charset) { + (*env)->SetByteArrayRegion(env, data, 0, (jsize)bytes, (const jbyte*)json); + if (!(*env)->ExceptionCheck(env)) result = (jstring)(*env)->NewObject(env, strings, constructor, data, charset); + } + if (!result) DEBUG_ERROR(DEBUG_CATEGORY_CHAT, "bridge: UTF-8 message result allocation failed"); + if (data) (*env)->DeleteLocalRef(env, data); + if (charset) (*env)->DeleteLocalRef(env, charset); + if (strings) (*env)->DeleteLocalRef(env, strings); u_free(json); (*env)->ReleaseStringUTFChars(env, channelId, ch); return result;