Appeler des appels système depuis Java

12

Existe-t-il un moyen d'appeler des appels système directement à partir de Java, ou est-il nécessaire d'appeler d'abord une méthode native?

santiago.basulto
la source

Réponses:

11

Vous devez utiliser une méthode native, mais vous n'avez pas besoin de l'implémenter vous-même. Java a une variante de JNI appelée JNA (Java Native Access) , qui vous permet d'accéder directement aux bibliothèques partagées sans avoir besoin d'une interface JNI enroulée autour d'elles, vous pouvez donc l'utiliser pour interfacer directement avec glibc:

import com.sun.jna.Library;
import com.sun.jna.Native;

public class Test {
    public interface CStdLib extends Library {
        int syscall(int number, Object... args);
    }

    public static void main(String[] args) {
        CStdLib c = (CStdLib)Native.loadLibrary("c", CStdLib.class);

        // WARNING: These syscall numbers are for x86 only
        System.out.println("PID: " + c.syscall(20));
        System.out.println("UID: " + c.syscall(24));
        System.out.println("GID: " + c.syscall(47));
        c.syscall(39, "/tmp/create-new-directory-here");
    }
}
Michael Mrozek
la source
intéressant, est-il possible d'utiliser des noms de fonction au lieu de nombres?
maxschlepzig
1
@max Dans l' syscallinterface? Non, syscallprend un entier pour représenter l'appel approprié à faire, tout comme sur le côté C. Il y a un tas de #defines dans /usr/include/asm/unistd.h, comme #define __NR_mkdir 39pour le rendre plus facile pour les gens qui appellent la fonction C, mais je ne pense pas qu'il y ait un moyen d'importer automatiquement ceux-ci dans Java, vous devez les définir tous vous
Michael Mrozek
2
Attention, les chiffres sur x86 et x86-64 sont différents sous Linux.
Maciej Piechotka
@Maciej Bon point, ajout d'un avertissement dans la réponse
Michael Mrozek
Grande réponse frère! Merci de votre aide. De là, j'ai une autre question. Je vais le demander dans une minute.
santiago.basulto
2

Il est nécessaire d'utiliser une méthode native ou une bibliothèque qui le fait pour vous.

bmargulies
la source