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ó 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:
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");
}
}
syscall
giao diện? Không, syscall
lấ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 #define
tham gia /usr/include/asm/unistd.h
, muốn #define __NR_mkdir 39
giú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
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.