Ce face native
O metodă native are doar antetul în Java, terminat cu ;. Implementarea este într-o bibliotecă a sistemului de operare, scrisă de obicei în C sau C++, legată prin JNI (Java Native Interface) și încărcată cu System.loadLibrary.
Biblioteca standard folosește native pentru lucruri pe care Java nu le poate face singur: Object.hashCode(), Thread.currentThread(), System.arraycopy. În aplicațiile obișnuite aproape nu-l vei scrie. Pentru apeluri către cod nativ, Java 22 a introdus API-ul Foreign Function & Memory (java.lang.foreign), mai sigur și mai simplu decât JNI.
Dacă biblioteca nativă lipsește, apelul metodei aruncă UnsatisfiedLinkError. Codul nativ nu are siguranța Java: o greșeală în el poate opri tot JVM-ul.
Exemple
Exemplul 1: Metode native din biblioteca standard
Prin reflecție verificăm modificatorii unor metode JDK. Programul declară și propria metodă native: compilarea merge, dar apelul eșuează pentru că nu există nicio bibliotecă nativă care să o implementeze.
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Main {
static native int citesteSenzor();
public static void main(String[] args) throws NoSuchMethodException {
Method hash = Object.class.getMethod("hashCode");
Method copiere = System.class.getMethod("arraycopy", Object.class, int.class, Object.class, int.class, int.class);
Method lungime = String.class.getMethod("length");
System.out.println("Object.hashCode nativă? " + Modifier.isNative(hash.getModifiers()));
System.out.println("System.arraycopy nativă? " + Modifier.isNative(copiere.getModifiers()));
System.out.println("String.length nativă? " + Modifier.isNative(lungime.getModifiers()));
try {
System.out.println(citesteSenzor());
} catch (UnsatisfiedLinkError e) {
System.out.println("UnsatisfiedLinkError: " + e.getMessage());
}
}
}
Rezultat
Object.hashCode nativă? true
System.arraycopy nativă? true
String.length nativă? false
UnsatisfiedLinkError: 'int Main.citesteSenzor()'
Greșeli frecvente
- Scrii corp pentru o metodă
native:native methods cannot have a body. - Uiți
System.loadLibrarysau biblioteca nu e înjava.library.path:UnsatisfiedLinkErrorla primul apel. - Alegi JNI pentru un proiect nou. În Java modern, API-ul
java.lang.foreignface aceleași apeluri fără cod C de legătură.
Comenzi înrudite
transient: transient marchează un câmp care nu trebuie salvat când obiectul este serializat; la citire primește valoarea implicită.volatile: volatile pe un câmp garantează că fiecare fir vede imediat ultima valoare scrisă; nu face însă operațiile compuse (x++) atomice.java (lansatorul): java pornește mașina virtuală Java și rulează un program: o clasă compilată, un fișier .jar sau direct un fișier sursă .java.