native în Java

native declară o metodă fără corp, implementată în cod nativ (C, C++) și apelată prin JNI; nu se scrie aproape niciodată în aplicații obișnuite.

Sintaxă
class Senzor {
    static { System.loadLibrary("senzor"); }   // încarcă libsenzor.so / senzor.dll
    native double citesteTemperatura();         // implementată în C/C++
}

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.loadLibrary sau biblioteca nu e în java.library.path: UnsatisfiedLinkError la primul apel.
  • Alegi JNI pentru un proiect nou. În Java modern, API-ul java.lang.foreign face 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.