Domanda

Sono uno sviluppatore Java da un paio d'anni e ho sentito che con JNI puoi fare alcune cose utili e potenti. Non so se non ho bisogno di usarlo o se non è terribilmente rilevante per me; ma non ho dovuto toccarlo affatto.

Mi chiedo quale sia l'utilità di questo aspetto di Java. Gli esempi sarebbero fantastici.

È stato utile?

Soluzione

È molto utile. Vedo 2 motivi principali per utilizzare JNI (probabilmente ce ne sono altri).

  1. Prestazioni. Se hai un pezzo di codice in cui Java Runtime per qualsiasi motivo non può ridurlo in termini di prestazioni. È possibile implementare quella funzione nel codice nativo e chiamarla da Java. Ciò ti consente di mettere a punto l'implementazione se davvero è necessario. Questo è probabilmente il motivo meno comune, tuttavia, Java di solito funziona bene.

  2. Accesso ad API specifiche del sistema operativo. Questo è un grosso problema. Ho avuto un caso in cui dovevo fare qualcosa in Java, ma avevo anche bisogno di accedere a qualcosa che Java semplicemente non poteva fornire. Nel mio caso si trattava di socket di dominio UNIX. Poiché (come si può dire dal nome) sono specifici di UNIX, non esiste un modo Java standard per usarli. Così ho creato una classe che si comportava come un involucro attorno a loro in C e vi accedevo con JNI. viola, problema risolto.

Altri suggerimenti

Ho scritto un ampio livello JNI per iSeries per accedere a DB2, code utente, code dati e alcuni altri dettagli OS / 400. Gran parte del nostro sistema su iSeries sarebbe stato impossibile senza JNI. Quindi sì, JNI ha il suo posto e quando ne hai bisogno, davvero ne ha bisogno.

È relativamente difficile (vicino a Java puro), ma potente e non orribile.

Inoltre, ogni volta che guardo un codice JNI, prendo in considerazione l'utilizzo di JNA .

Posso pensare ad alcuni usi dalla parte superiore della mia testa:

  1. integrazione con esistenti di basso livello (C / C ++) API che non dispongono di Java omologo
  2. integrarsi con gli aspetti del sistema che non sono esposti tramite le API Java disponibili (diretto accesso hardware, ecc.)

Alcuni potrebbero dire che può essere utile per creare sezioni di codice altamente ottimizzate, tuttavia con le moderne JVM stai diventando abbastanza veloce e le complicazioni dell'uso di JNI probabilmente supererebbero qualsiasi vantaggio in termini di prestazioni che potresti vedere.

Vi sono alcuni usi per l'associazione a FFMPeg per la decodifica C del formato video / audio (dannatamente vicino a qualsiasi).

C'è anche JNA, il che rende come se stessi usando la libreria stessa. Questo è "più facile" dal punto di vista che passa tutto allo sviluppatore Java da gestire, e più difficile nel senso che devi capire la mappatura della struttura e fare molto lavoro grugnito per far passare correttamente tutti i puntatori, ecc.

Avevamo l'obbligo di racchiudere una nuova interfaccia utente attorno a un'applicazione C legacy in esecuzione su Suse Linux. JNI era lo strumento perfetto per il lavoro.

In generale, penso che JNI sia in contraddizione con la nozione Java di Write Once, Run Anywhere. Tuttavia, ci sono casi d'uso in cui JNI può essere utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top