# Module: kernel + jni — C↔Java 橋

`kernel`（6 檔）與 `jni`（14 檔）是 Java 層與 native 引擎（`libdoppler`、`libHSocketIf`、`libh264rtp`、`libhopencvif_lib`、`libfpgargb_lib`）的接口。

## Responsibilities

- C→Java 消息推送：native 產生的 `what/arg1/arg2` 消息泵入主線程
- Java→C 調用：探頭參數查詢、系統控制、DICOM、DSC、預設、影像
- 串口/USB Socket 訪問（`libHSocketIf`）
- FPGA RGB 輸出（`libfpgargb_lib`）、H.264 視頻解碼（`libh264rtp`）、OpenCV 封裝（`libhopencvif_lib`）

## Key Files

- `kernel/MainHandler.java` — 主線程單例 Handler：起一個輪詢線程不停調 `jnitojava.JavaGetMessage(long[4])`，有消息就廣播給 `mDopplerMsgHandlerVector` 所有註冊 Handler
- `kernel/DopplerHandler.java` — Doppler 專用 Handler 封裝
- `kernel/HObserver.java` / `HObservable.java` — 觀察者模式基類（UI 訂閱影像/參數事件）
- `kernel/FocusResMng.java`、`kernel/WinRect.java` — 焦點/窗口矩形輔助
- `handprobe/application/usb/jnitojava.java` — native 回調 Java 的固定簽名入口（`JavaGetMessage`、`SetJniEvn`、`UsbWriteDwords`、`UsbReadDwords`、`WUsbReadImg`、`UpdateMITI`、`GetPattern`、`CineDataCapture`…）

## Native 庫加載映射（`System.loadLibrary` 實測）

| Java 類 | 庫 |
|---|---|
| `HPidIf` `HBeParamIf` `HFeParamIf` `HDicomIf` `HDscClassIf` `HPresetIf` `HSysctrlIf` | `libdoppler`（核心） |
| `SerialPort` `MeasFormulaParser` `InputUtils` `HGLImageJNIViewLib` | `libHSocketIf`（USB/串口/GL） |
| `HH264PlayerIf` | `libh264rtp` |
| `HOpencvIf` | `libhopencvif_lib` |
| `fpgargb_lib` | `libfpgargb_lib` |
| `IDReader.DecodeWlt` | `DecodeWlt`（中國身份證讀卡） |

## Public API 精選

- `HPidIf` — 探頭查詢：`GetProbeId(String)`、`GetProbeName(int)`、`GetProbeElementNumber()`、`GetProbeRadius()`、`GetProbeType(int)`、`InitPidSys()`、`setPidFilesPath(String)`
- `HSysctrlIf` — 系統控制：`SetProbeConnType(int)` 等（190+ 行，最大接口之一）
- `HGLImageJNIViewLib` — OpenGL 影像視圖
- `SerialPort` — 串口讀寫
- `MeasFormulaParser` — 測量公式解析（native）

## Internal Structure

兩條消息路徑：

```
native → jnitojava.JavaGetMessage (輪詢) → kernel.MainHandler (主線程廣播) → 註冊 Handler
Java  → jni.* static native → libdoppler / libHSocketIf
```

## Dependencies

- **Used by:** `handprobe.application.*`（幾乎所有核心包）、`com.Com.handprobe.*`
- **Uses:** Android `System.loadLibrary`、`libc++_shared`（native 依賴）

## Notable Patterns / Gotchas

- **輪詢而非回調**：`JavaGetMessage` 在後台線程忙輪詢（`Tools.Sleep(20)`），避免 JNIEnv 跨線程 attach 複雜度
- 消息為固定 4×long 佈局（`[0]=what, [1]=arg1, [2]=arg2`），擴展性有限
- 多個 JNI 類載入同一個 `libdoppler`——native 側按類名分派（靜態註冊）
- `jnitojava` 的方法名固定為 native 側硬編碼的回調點（改 Java 方法名會斷鏈）
