Есть ли способ вызывать системные вызовы непосредственно из Java или необходимо сначала вызвать нативный метод?
Есть ли способ вызывать системные вызовы непосредственно из Java или необходимо сначала вызвать нативный метод?
Ответы:
Вам нужно использовать собственный метод, но вам не нужно реализовывать его самостоятельно. У Java есть разновидность JNI, называемая JNA (Java Native Access) , которая позволяет напрямую обращаться к разделяемым библиотекам без необходимости оборачивать их интерфейсом JNI, поэтому вы можете использовать его для непосредственного взаимодействия с 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
интерфейсе? Нет, syscall
принимает целое число для представления соответствующего вызова, как на стороне C. Есть множество #define
s /usr/include/asm/unistd.h
, например, #define __NR_mkdir 39
для того, чтобы людям, вызывающим функцию C, было проще, но я не думаю, что есть какой-либо способ автоматически импортировать их в Java, вам придется определять их все самостоятельно
Необходимо использовать нативный метод или библиотеку, которая делает это за вас.