# नेटिव इंटीग्रेशन (PlatformUtils, JNI, crossfly-lib)

> न्यूट्रल Java कोड OS तक कैसे पहुँचता है — एकल बिंदु PlatformUtils और fallback पैटर्न।

Source: https://crossfly.dev/hi/docs/platforms/native-integration — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# नेटिव इंटीग्रेशन 🤖🍎🖥️

**न्यूट्रल** Java कोड (`core` में) उन OS सुविधाओं तक कैसे पहुँचता है जो प्लेटफ़ॉर्म के अनुसार भिन्न होती हैं।

## `PlatformUtils` — एब्स्ट्रैक्शन का एकल बिंदु
`PlatformUtils.instance` प्लेटफ़ॉर्म फ़ैसाड है। **हर launcher अपना कार्यान्वयन इंस्टॉल करता है**
(वेब `PlatformUtilsWeb` इंस्टॉल करता है)। मुख्य मेथड:
```java
IWebView wv = PlatformUtils.instance.createWebView();   // जहाँ webview नहीं है वहाँ null (web)
PlatformUtils.instance.view(url);                        // बाहरी URL खोलता है
PlatformUtils.instance.dial(numero);                     // डायल करता है
```

## नेटिव लाइब्रेरी `crossfly-lib`
आरंभ में `Main.create()` के भीतर `SharedLibraryLoader.load("crossfly-lib")` द्वारा लोड की जाती है —
**सभी लक्ष्यों पर, WebGL को छोड़कर**:
```java
if (Gdx.app.getType() != Application.ApplicationType.WebGL)
   new SharedLibraryLoader().load("crossfly-lib");
```
इसलिए, जो कुछ भी इस पर निर्भर है (उदा.: JNI के ज़रिए `NativeImage`) **वेब पर मौजूद नहीं है** — वहाँ
शुद्ध Java कार्यान्वयन (`JavaImageOps`) या *stub* लागू होता है।

## "fallback के साथ नेटिव सुविधा" पैटर्न
ऐसी सुविधा का उपयोग करने से पहले हमेशा **जाँचें** जो मौजूद नहीं हो सकती:
```java
if (PlatformUtils.instance.createWebView() != null) {
   WebContainer c = new WebContainer();     // Android/iOS/Desktop
   painel.add(LAY_FILL, c);
   c.show(url);
} else {
   PlatformUtils.instance.view(url);        // Web: बाहर से खोलता है
}
```
यही बात कैमरा/मानचित्र के `null` रिटर्न और `Device.platform` पर भी लागू होती है:
```java
if (Device.platform.isDesktop()) { /* desktop पथ */ }
```

## अपना स्वयं का नेटिव कार्यान्वयन लिखना
ठोस सेवाएँ (webview, GPS, आदि) **`core` के बाहर**, हर launcher में रहती हैं। किसी नई सुविधा के लिए,
इंटरफ़ेस `core` में परिभाषित करें और उसे हर launcher के लिए लागू करें, आरंभ में उसे `PlatformUtils`/सेवा
फ़ील्ड में इंस्टॉल करें। इमेज एब्स्ट्रैक्शन इसी मॉडल का अनुसरण करता है: `ImageOps` → `JavaImageOps` (JVM) बनाम
`NativeImage` (JNI)।

## सर्वोत्तम अभ्यास
- **कभी** यह न मानें कि कोई डिवाइस सुविधा मौजूद है — `!= null`/`Device.platform` जाँचें।
- OS-विशिष्ट कोड को **launcher में** रखें, `core` में नहीं।

## सामान्य त्रुटियाँ
- fallback के बिना कोई नेटिव सुविधा कॉल करना (वेब पर टूट जाता है)।
- वेब पर `crossfly-lib`/JNI की अपेक्षा करना (WebGL में लोड नहीं होती)।

## यह भी देखें
- [Web (TeaVM)](/docs/platforms/web-teavm) · [WebContainer](/docs/ui/widgets/webcontainer)
