From 0f1e6e00065518e8c46e9154ff3e80a3ee3d083f Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 28 Jul 2026 23:20:19 +0300 Subject: [PATCH] =?UTF-8?q?android:=20fix=20NDK=20build=20=E2=80=94=20add?= =?UTF-8?q?=20Opus=20sources,=20fix=20Kotlin=20composable=20context,=20fix?= =?UTF-8?q?=20bridge=20db=5Fpath=20param?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/cpp/CMakeLists.txt | 15 +++++++++++++-- .../java/com/utun/chat/ui/screens/ChatScreen.kt | 2 +- .../jni_bridge/android_jni_bridge.c | 6 +++--- .../jni_bridge/android_jni_bridge.h | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/tools/chatgui-android/app/src/main/cpp/CMakeLists.txt b/tools/chatgui-android/app/src/main/cpp/CMakeLists.txt index b306be25..3a1139c5 100644 --- a/tools/chatgui-android/app/src/main/cpp/CMakeLists.txt +++ b/tools/chatgui-android/app/src/main/cpp/CMakeLists.txt @@ -10,13 +10,24 @@ set(TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../..) include(${CFG_DIR}/utun_sources.cmake) utun_setup_sources("${LIB_DIR}" "${SRC_DIR}" "${CFG_DIR}" "${TOOLS_DIR}") -# Exclude opus from Android (no prebuilt for NDK) -list(FILTER UTUN_SOURCES EXCLUDE REGEX "opus_codec\\.c$") +# Include Opus codec wrapper (was excluded before voice support) +# list(FILTER UTUN_SOURCES EXCLUDE REGEX "opus_codec\\.c$") # Exclude tun_windows and tun_freebsd (Android is Linux-like) list(FILTER UTUN_SOURCES EXCLUDE REGEX "tun_windows\\.c$") list(FILTER UTUN_SOURCES EXCLUDE REGEX "tun_freebsd\\.c$") +# Add libopus sources (for voice recording) +file(GLOB_RECURSE _OPUS_SRC "${LIB_DIR}/libopus/src/*.c" + "${LIB_DIR}/libopus/celt/*.c" "${LIB_DIR}/libopus/silk/*.c" + "${LIB_DIR}/libopus/silk/float/*.c") +list(FILTER _OPUS_SRC EXCLUDE REGEX "/x86/") +list(APPEND UTUN_SOURCES ${_OPUS_SRC}) +list(APPEND UTUN_INCLUDE_DIRS "${LIB_DIR}/libopus" "${LIB_DIR}/libopus/include" + "${LIB_DIR}/libopus/celt" "${LIB_DIR}/libopus/silk" "${LIB_DIR}/libopus/silk/float") +# Opus requires these to be defined (or HAVE_CONFIG_H + config.h with VAR_ARRAYS) +list(APPEND UTUN_DEFINES OPUS_BUILD VAR_ARRAYS USE_ALLOCA) + # Prebuilt OpenSSL (cross-compiled for Android) set(OPENSSL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/openssl/${ANDROID_ABI}) add_library(openssl_crypto STATIC IMPORTED) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt index af2d1541..1934db8c 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt @@ -34,10 +34,10 @@ fun ChatScreen( var text by remember { mutableStateOf("") } val listState = rememberLazyListState() val isRecording by viewModel.isRecording.collectAsState() + val ctx = LocalContext.current val filePicker = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri -> uri?.let { - val ctx = LocalContext.current val path = it.path ?: return@let viewModel.sendAttachment(path) } diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index 9a379ad7..675cb1af 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -467,8 +467,8 @@ int utun_bridge_voice_get_compressor(void) { return voice_recorder_is_compressor_enabled(); } -int utun_bridge_attachment_send(const char* channel_id, const char* file_path) { - return attachment_send(channel_id, file_path, g_db_path); +int utun_bridge_attachment_send(const char* channel_id, const char* file_path, const char* db_path) { + return attachment_send(channel_id, file_path, db_path); } /* ────────────────────────────────────────────────────────────────── @@ -993,7 +993,7 @@ JNIEXPORT jboolean JNICALL Java_com_utun_chat_data_NativeLib_nativeAttachmentSen (void)thiz; const char* ch = (*env)->GetStringUTFChars(env, channelId, NULL); const char* fp = (*env)->GetStringUTFChars(env, filePath, NULL); - int rc = utun_bridge_attachment_send(ch, fp); + int rc = utun_bridge_attachment_send(ch, fp, g_db_path); if (fp) (*env)->ReleaseStringUTFChars(env, filePath, fp); if (ch) (*env)->ReleaseStringUTFChars(env, channelId, ch); return (rc == 0) ? JNI_TRUE : JNI_FALSE; diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.h b/tools/chatgui-android/jni_bridge/android_jni_bridge.h index 38332c4a..ece716ed 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.h +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.h @@ -88,7 +88,7 @@ int utun_bridge_voice_get_compressor(void); /* ── Attachment ── */ -int utun_bridge_attachment_send(const char* channel_id, const char* file_path); +int utun_bridge_attachment_send(const char* channel_id, const char* file_path, const char* db_path); /* ── Voice playback (Opus decode) ── */