Aktifkan Syscalls dari Jawa

12

Apakah ada cara untuk memanggil syscalls langsung dari Jawa, atau apakah perlu untuk memanggil metode asli terlebih dahulu?

santiago.basulto
sumber

Jawaban:

11

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");
    }
}
Michael Mrozek
sumber
menarik, mungkinkah menggunakan nama fungsi alih-alih angka?
maxschlepzig
1
@ Max Dalam syscallantarmuka? Tidak, syscallmembutuhkan integer untuk merepresentasikan panggilan yang tepat untuk dibuat, seperti halnya pada sisi C. Ada banyak #defines /usr/include/asm/unistd.h, seperti #define __NR_mkdir 39untuk 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 semuanya
Michael Mrozek
2
Waspadalah - angka-angka di x86 dan x86-64 berbeda di Linux.
Maciej Piechotka
@Maciej Poin bagus, menambahkan peringatan dalam jawaban
Michael Mrozek
Jawaban yang bagus, saudara! Terima kasih atas bantuan Anda. Dari sini saya punya pertanyaan lain. Saya akan menanyakannya sebentar lagi.
santiago.basulto
2

Penting untuk menggunakan metode asli, atau perpustakaan yang melakukannya untuk Anda.

bmargulies
sumber