JavaからのSyscallの呼び出し


12

Javaから直接syscallsを呼び出す方法はありますか、それとも最初にネイティブメソッドを呼び出す必要がありますか?

回答:


11

ネイティブメソッドを使用する必要がありますが、自分で実装する必要はありません。JavaにはJNA(Java Native Access)と呼ばれるJNIのバリエーションがあり、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");
    }
}

興味深いのは、数字の代わりに関数名を使用することは可能ですか?
maxschlepzig

1
@max syscallインターフェイスで?いいえ、syscallC側と同様に、行う適切な呼び出しを表す整数を取ります。C関数を呼び出す人が簡単にできるよう#define/usr/include/asm/unistd.h、にsがたくさんありますが、#define __NR_mkdir 39それらをJavaに自動的にインポートする方法はないと思います。すべて自分で定義する必要があります
Michael Mrozek

2
注意してください-x86とx86-64の数字はLinuxで異なります。
マチェイピエチョトカ

@Maciej良い点、答えに警告を追加
Michael Mrozek

グレートアンサー兄弟!ご協力いただきありがとうございます。ここから別の質問があります。すぐに質問します。
santiago.basulto

2

ネイティブメソッド、またはそれを行うライブラリを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.