Czy istnieje sposób wywoływania wywołań systemowych bezpośrednio z Javy, czy też konieczne jest najpierw wywołanie metody rodzimej?
Czy istnieje sposób wywoływania wywołań systemowych bezpośrednio z Javy, czy też konieczne jest najpierw wywołanie metody rodzimej?
Odpowiedzi:
Musisz użyć metody natywnej, ale nie musisz jej implementować samodzielnie. Java ma odmianę JNI o nazwie JNA (Java Native Access) , która pozwala na bezpośredni dostęp do bibliotek współdzielonych bez potrzeby otaczania ich interfejsem JNI, dzięki czemu można go używać bezpośrednio do interfejsu 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
interfejsie? Nie, syscall
przyjmuje liczbę całkowitą reprezentującą odpowiednie wywołanie, tak jak po stronie C. Istnieje kilka #define
s /usr/include/asm/unistd.h
, na przykład, #define __NR_mkdir 39
aby ułatwić ludziom wywoływanie funkcji C, ale nie sądzę, że istnieje sposób na automatyczne zaimportowanie ich do Javy, trzeba je wszystkie zdefiniować samodzielnie
Konieczne jest użycie metody natywnej lub biblioteki, która to robi.