Apakah ada cara untuk memanggil syscalls langsung dari Jawa, atau apakah perlu untuk memanggil metode asli terlebih dahulu?
12
Anda perlu menggunakan metode asli, tetapi Anda tidak perlu menerapkannya sendiri. Java memiliki variasi pada JNI yang disebut JNA (Java Native Access) , yang memungkinkan Anda mengakses pustaka bersama secara langsung tanpa memerlukan antarmuka JNI yang melilitnya, sehingga Anda dapat menggunakannya untuk berinteraksi langsung dengan 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
antarmuka? Tidak,syscall
membutuhkan integer untuk merepresentasikan panggilan yang tepat untuk dibuat, seperti halnya pada sisi C. Ada banyak#define
s/usr/include/asm/unistd.h
, seperti#define __NR_mkdir 39
untuk membuatnya lebih mudah bagi orang yang memanggil fungsi C, tapi saya tidak berpikir ada cara untuk secara otomatis mengimpor mereka ke Jawa, Anda harus menentukan sendiri semuanyaPenting untuk menggunakan metode asli, atau perpustakaan yang melakukannya untuk Anda.
sumber