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?
12
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");
}
}
syscall
interface? Non,syscall
prend un entier pour représenter l'appel approprié à faire, tout comme sur le côté C. Il y a un tas de#define
s dans/usr/include/asm/unistd.h
, comme#define __NR_mkdir 39
pour 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 vousIl est nécessaire d'utiliser une méthode native ou une bibliothèque qui le fait pour vous.
la source