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?

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");
    }
}

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.