Existe uma maneira de chamar syscalls diretamente do Java ou é necessário chamar primeiro um método nativo?
12
Você precisa usar um método nativo, mas não precisa implementá-lo. O Java tem uma variação no JNI chamada JNA (Java Native Access) , que permite acessar bibliotecas compartilhadas diretamente, sem a necessidade de uma interface JNI envolvida por elas, para que você possa usá-lo para fazer a interface diretamente com o 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? Não,syscall
leva um número inteiro para representar a chamada apropriada a ser feita, assim como no lado C. Há um monte de#define
s em/usr/include/asm/unistd.h
, como#define __NR_mkdir 39
para torná-lo mais fácil para as pessoas chamando a função C, mas eu não acho que há alguma maneira de importar automaticamente aqueles em Java, você teria que definir todos eles yourselfÉ necessário usar um método nativo ou uma biblioteca que faça isso para você.
fonte