RNI(Raw Native Interface)比 J/Direct 複雜但功能更強。RNI 更貼近 JVM,能編寫更高效代碼,處理原生方法中的 Java 物件,實現與 JVM 內部機制更緊密整合。概念上類似 Sun JNI,本文重點說明主要差異,詳細情況請參考 Microsoft 文件。
二進制佈局直接存取:RNI 原生方法程式設計師知曉物件二進制佈局,可直接存取所需資訊,無需像 JNI 獲取欄位/方法標識符。代價是此原生方法僅能在 Microsoft JVM 運行。
JVM 控制函數直接調用:JNI 透過 JNIEnv 參數存取大量函數;RNI 將控制 JVM 運作的函數變為可直接調用。部分類似 JNI「兄弟」(如異常控制),但大多數名稱與用途不同。
垃圾收集模型差異:JNI 中垃圾收集在原生方法執行期遵循同 Java 代碼相同規則;RNI 中程式設計師需自行負責原生方法活動期間垃圾收集器啟動與中止。預設進入原生方法前 GC 不活動,程式設計師可假設物件該時段不被收集。長時間執行時需調用 GCEnable() 啟動 GC。
全域控制機制:類似 JNI 全域控制,RNI 稱 GCFrames,保證特定物件在 GC 活動期間不被當作垃圾收集。
文中展示 msjavah 為 ShowMsgBox 類別生成的 C 標頭檔,包含結構定義、導出函數宣告等,體現 RNI 直接操作物件二進制佈局的特性。