# QuicProChat Kotlin SDK Kotlin/JVM wrapper over `libquicprochat_ffi` via JNI for Android and JVM platforms. ## Prerequisites - Kotlin 1.9+ / JDK 17+ - `libquicprochat_ffi` built for the target architecture - JNI bridge compiled (`jni/dev_quicprochat_NativeBridge.c`) ## Building the Native Library ```sh # Linux (JVM) cargo build --release -p quicprochat-ffi # Android (aarch64) cargo build --release -p quicprochat-ffi --target aarch64-linux-android # Android (armv7) cargo build --release -p quicprochat-ffi --target armv7-linux-androideabi ``` ### Compiling the JNI Bridge ```sh cd jni gcc -shared -fPIC -o libquicprochat_jni.so \ -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \ dev_quicprochat_NativeBridge.c \ -L ../../../../target/release -lquicprochat_ffi ``` ## Installation ### Gradle ```kotlin dependencies { implementation(files("libs/quicprochat-0.1.0.jar")) } ``` Or include as a local project module. ## Usage ```kotlin import dev.quicprochat.QpqClient val client = QpqClient("127.0.0.1:5001", caCertPath = "ca.pem") client.login("alice", "secret") client.send("bob", "hello".toByteArray()) val messages = client.receive(timeoutMs = 5000) messages.forEach { println("Received: $it") } client.close() ``` ## API | Method | Description | |---|---| | `QpqClient(server, caCertPath, serverName)` | Connect to server | | `client.login(username, password)` | OPAQUE authentication | | `client.send(recipient, message)` | Send message by username | | `client.receive(timeoutMs)` | Receive pending messages | | `client.close()` / `client.disconnect()` | Disconnect | | `client.isConnected` | Connection status | ## Error Handling ```kotlin try { client.login("alice", "wrong") } catch (e: QpqAuthException) { println("Auth failed: ${e.message}") } catch (e: QpqTimeoutException) { println("Timeout: ${e.message}") } catch (e: QpqException) { println("Error: ${e.message}") } ``` ## Structure - `src/main/kotlin/dev/quicprochat/QpqClient.kt` -- High-level client - `src/main/kotlin/dev/quicprochat/NativeBridge.kt` -- JNI declarations - `src/main/kotlin/dev/quicprochat/QpqError.kt` -- Exception types - `jni/dev_quicprochat_NativeBridge.c` -- JNI C bridge to FFI ## Android Integration 1. Add the native libraries to `src/main/jniLibs//`: - `arm64-v8a/libquicprochat_ffi.so` - `armeabi-v7a/libquicprochat_ffi.so` 2. Add the JNI bridge library alongside 3. The `NativeBridge` class loads the library via `System.loadLibrary` ## Cross-Compilation ```sh # Install Android NDK targets rustup target add aarch64-linux-android armv7-linux-androideabi # Build with the NDK linker CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android21-clang \ cargo build --release -p quicprochat-ffi --target aarch64-linux-android ```