C'è un modo per invocare syscalls direttamente da Java o è necessario prima chiamare un metodo nativo?
C'è un modo per invocare syscalls direttamente da Java o è necessario prima chiamare un metodo nativo?
Risposte:
È necessario utilizzare un metodo nativo, ma non è necessario implementarlo da soli. Java ha una variante su JNI chiamata JNA (Java Native Access) , che ti consente di accedere direttamente alle librerie condivise senza bisogno di un'interfaccia JNI racchiusa tra loro, quindi puoi usarla per interfacciarsi direttamente con 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
? No, syscall
richiede un numero intero per rappresentare la chiamata appropriata da effettuare, proprio come sul lato C. Ci sono un sacco di messaggi #define
dentro /usr/include/asm/unistd.h
, come #define __NR_mkdir 39
per rendere più facile per le persone che chiamano la funzione C, ma non penso che ci sia alcun modo per importarli automaticamente in Java, dovresti definirli tutti da soli
È necessario utilizzare un metodo nativo o una libreria che lo fa per te.