Gibt es eine Möglichkeit, Syscalls direkt von Java aus aufzurufen, oder muss zuerst eine systemeigene Methode aufgerufen werden?
12
Sie müssen eine native Methode verwenden, diese jedoch nicht selbst implementieren. Java hat eine JNI-Variante namens JNA (Java Native Access) , mit der Sie direkt auf gemeinsam genutzte Bibliotheken zugreifen können, ohne dass eine JNI-Schnittstelle um diese herum gewickelt werden muss.
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
Schnittstelle? Nein, essyscall
wird eine Ganzzahl verwendet, um den entsprechenden Aufruf zu repräsentieren, genau wie auf der C-Seite. Es gibt eine Reihe von#define
s in/usr/include/asm/unistd.h
, wie#define __NR_mkdir 39
es einfacher zu machen für die Menschen dem Aufruf der C - Funktion, aber ich glaube nicht , dass es eine Möglichkeit, automatisch diejenigen in Java zu importieren, würden Sie haben sie alle selbst definierenEs ist erforderlich, eine native Methode oder eine Bibliothek zu verwenden, die dies für Sie erledigt.
quelle