# clipboard **Repository Path**: xcode_xiao/clipboard ## Basic Information - **Project Name**: clipboard - **Description**: Java + Rust JNI 跨平台剪贴板库,用于在 Java 项目中统一读写系统剪贴板,并支持剪贴板变更监听。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-19 - **Last Updated**: 2026-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # clipboard-jni-bridge [![](https://www.jitpack.io/v/com.gitee.xcode_xiao/clipboard.svg)](https://www.jitpack.io/#com.gitee.xcode_xiao/clipboard) A cross-platform Java + Rust JNI clipboard bridge built on top of [clipboard-rs](https://github.com/ChurchTao/clipboard-rs). It provides unified clipboard read/write/watch APIs for Java applications. - Rust Native: `clipboard-rs` - Java Bridge: `clipboard-bridge` module - Platforms: Windows / macOS / Linux (following `clipboard-rs` support) ## Feature Support - Plain Text - HTML - RTF (Rich Text) - Image (PNG) - File List - Clipboard Change Watcher ## Platform Support Matrix | Type | Windows | macOS | Linux(X11) | | --- | --- | --- | --- | | Plain Text | ✅ | ✅ | ✅ | | HTML | ✅ | ✅ | ✅ | | RTF | ✅ | ✅ | ✅ | | Image(PNG) | ✅ | ✅ | ✅ | | File List | ✅ | ✅ | ✅ | | Watch Changes | ✅ | ✅ | ✅ | Note: platform-level capabilities come from `clipboard-rs`. This project adds JNI bindings and Java type modeling. ## Project Layout - `clipboard-bridge/`: JNI bridge module (Java API + Rust Native) - `clipboard-bridge/rust/`: Rust dynamic library source - `clipboard-bridge/src/main/java/me/xiaolei/clipboard/`: Java API and models - `clipboard-bridge/src/main/resources/native/`: platform-specific native artifacts ## Usage ### 1. Read Clipboard ```java import me.xiaolei.clipboard.NativeClipboard; import me.xiaolei.clipboard.model.*; ClipboardData data = NativeClipboard.getClipboardData(); switch (data.type()) { case TEXT -> System.out.println(((TextClipboardData) data).text()); case HTML -> System.out.println(((HtmlClipboardData) data).html()); case RTF -> System.out.println(((RtfClipboardData) data).rtf()); case IMAGE -> { ImageClipboardData img = (ImageClipboardData) data; System.out.println("image=" + img.width() + "x" + img.height()); System.out.println("pngBytes=" + img.pngBytes().length); } case FILE_LIST -> System.out.println(((FileListClipboardData) data).files()); case EMPTY -> System.out.println("clipboard empty"); } ``` ### 2. Write Clipboard ```java import me.xiaolei.clipboard.NativeClipboard; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; NativeClipboard.setText("hello"); NativeClipboard.setHtml("hello"); NativeClipboard.setRtf("{\\rtf1\\ansi hello}"); NativeClipboard.setFiles(List.of("/tmp/a.txt", "/tmp/b.png")); NativeClipboard.setImagePngBytes(Files.readAllBytes(Path.of("/tmp/test.png"))); ``` ### 3. Watch Clipboard Changes ```java import me.xiaolei.clipboard.NativeClipboard; NativeClipboard.startListener(data -> { System.out.println("changed type=" + data.type()); }); Thread.sleep(10_000); NativeClipboard.stopListener(); ``` ## Build ### Build whole project ```bash ./gradlew build ``` ### Build JNI module only ```bash ./gradlew :clipboard-bridge:build ``` ### Build with specific Rust targets ```bash ./gradlew :clipboard-bridge:build -PnativeTargets=x86_64-apple-darwin,aarch64-apple-darwin ``` Build pipeline includes: 1. Rust build (`buildRustNative`) 2. Copy artifacts to resources (`copyRustNativeToResources`) 3. Java resource process & packaging ## Design Notes - Text/HTML/RTF/File List: JSON over JNI boundary - Image: binary `byte[]` over JNI (no Base64), reducing memory and CPU overhead - Watcher: dedicated Rust thread, callback into Java `ClipboardChangeListener` ## References - [ChurchTao/clipboard-rs](https://github.com/ChurchTao/clipboard-rs) - [clipboard-rs docs.rs](https://docs.rs/clipboard-rs/latest/clipboard_rs/) ## License MIT License (adjust if your repository uses a different license).