Gọi các tòa nhà cao tầng từ Java


12

Có cách nào để gọi các tòa nhà trực tiếp từ Java hay trước tiên cần phải gọi một phương thức gốc?

Câu trả lời:


11

Bạn cần sử dụng một phương thức riêng, nhưng bạn không cần phải tự thực hiện. Java có một biến thể trên JNI được gọi là JNA (Truy cập gốc Java) , cho phép bạn truy cập trực tiếp các thư viện được chia sẻ mà không cần giao diện JNI bao quanh chúng, vì vậy bạn có thể sử dụng giao diện đó trực tiếp với 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");
    }
}

Thật thú vị, có thể sử dụng tên hàm thay vì số?
maxschlepzig

1
@max Trong syscallgiao diện? Không, syscalllấy một số nguyên để biểu diễn cuộc gọi thích hợp để thực hiện, giống như ở bên C. Có rất nhiều người #definetham gia /usr/include/asm/unistd.h, muốn #define __NR_mkdir 39giúp mọi người gọi hàm C dễ dàng hơn, nhưng tôi không nghĩ có cách nào để tự động nhập chúng vào Java, bạn phải tự xác định tất cả chúng
Michael Mrozek

2
Xin lưu ý - các số trên x86 và x86-64 khác nhau trên Linux.
Maciej Piechotka

@Maciej Điểm hay, đã thêm cảnh báo trong câu trả lời
Michael Mrozek

Trả lời tuyệt vời anh ạ! Cảm ơn bạn đã giúp đỡ. Từ đây tôi có một câu hỏi khác. Tôi sẽ hỏi nó trong một phút nữa.
santiago.basulto

2

Nó là cần thiết để sử dụng một phương thức bản địa, hoặc một thư viện làm điều đó cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.