Rumah  >  Artikel  >  Java  >  Cara melaksanakan panggilan sistem pengendalian dan teknologi asas JNI Java

Cara melaksanakan panggilan sistem pengendalian dan teknologi asas JNI Java

WBOY
WBOYasal
2023-11-08 10:51:11669semak imbas

Cara melaksanakan panggilan sistem pengendalian dan teknologi asas JNI Java

Cara melaksanakan panggilan sistem pengendalian teknologi asas Java dan JNI

Dalam pengaturcaraan Java, kami biasanya menggunakan ciri bahasa peringkat tinggi dan API untuk pembangunan . Tetapi kadangkala, kita perlu mengakses fungsi asas sistem pengendalian untuk memenuhi keperluan tertentu. Untuk mencapai tujuan ini, Java menyediakan panggilan sistem pengendalian mekanisme dan JNI (Antara Muka Asli Java).

Panggilan sistem pengendalian merujuk kepada program Java yang mengakses fungsi asas sistem pengendalian dengan memanggil fungsi yang disediakan oleh sistem pengendalian. JNI ialah mekanisme untuk program Java berinteraksi dengan kod C/C++ yang mendasari. Melalui JNI, kita boleh menulis kod peringkat rendah dan memanggil fungsi peringkat rendah ini dalam program Java.

Di bawah, saya akan memperkenalkan secara terperinci cara menggunakan panggilan sistem pengendalian dan JNI untuk melaksanakan teknologi asas Java.

1. Panggilan sistem pengendalian
Panggilan sistem pengendalian ialah program Java yang mengakses fungsi asas sistem pengendalian dengan memanggil API asas. Java menyediakan satu siri kelas untuk merangkum fungsi sistem pengendalian, seperti kelas java.lang.Runtime dan java.lang.Process.

  1. Menggunakan kelas java.lang.Runtime
    Kelas java.lang.Runtime ialah titik masuk untuk program Java untuk berinteraksi dengan sistem pengendalian. Ia menyediakan banyak kaedah untuk melaksanakan perintah sistem pengendalian, mendapatkan maklumat memori, memuatkan perpustakaan tempatan, dsb.

Berikut ialah contoh mudah yang menunjukkan cara menggunakan kelas java.lang.Runtime untuk melaksanakan arahan sistem pengendalian:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class OSCommandExample {
    public static void main(String[] args) {
        String command = "ls -l";
        try {
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Dalam contoh di atas, kita lulus kaedah Runtime.getRuntime().exec(command) melaksanakan perintah sistem pengendalian dan membaca output arahan melalui BufferedReader. Runtime.getRuntime().exec(command)方法执行了一个操作系统命令,并通过BufferedReader读取命令的输出结果。

  1. 使用java.lang.Process类
    java.lang.Process类是表示正在执行的进程的抽象类。它提供了一系列方法来获取进程的输入/输出流、等待进程完成等。

下面是一个示例,演示如何使用java.lang.Process类来执行操作系统命令:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ProcessExample {
    public static void main(String[] args) {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");
            Process process = processBuilder.start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述示例中,我们使用ProcessBuilder创建了一个进程,并通过start()方法执行操作系统命令。然后,我们通过BufferedReader读取命令的输出结果。

二、JNI(Java Native Interface)
如果我们需要访问更底层的功能,例如硬件接口或特定的操作系统功能,我们可以使用JNI。JNI是Java程序与底层C/C++代码进行交互的一种机制。

下面是一个简单的示例,演示如何使用JNI来实现Java底层技术:

  1. 创建Java类和Native方法
    首先,我们需要在Java类中声明native方法,以便在底层实现相关功能。然后,我们通过在本地库中实现这些native方法来实现底层功能。

以下是Java类的示例:

public class NativeExample {
    public native void printMessage(String message);

    static {
        System.loadLibrary("mylib");
    }

    public static void main(String[] args) {
        NativeExample example = new NativeExample();
        example.printMessage("Hello from Java!");
    }
}

在上述示例中,我们声明了一个native方法printMessage,并通过System.loadLibrary()方法加载本地库。然后,在main方法中调用这个native方法。

  1. 创建本地库
    在本地库中,我们可以使用C/C++语言实现native方法。然后,我们必须使用Java的JNI标准头文件jni.h来编译本地库。

以下是本地库的示例:

#include <jni.h>
#include <stdio.h>

JNIEXPORT void JNICALL Java_NativeExample_printMessage(JNIEnv *env, jobject obj, jstring message) {
    const char *c_message = (*env)->GetStringUTFChars(env, message, NULL);
    printf("%s
", c_message);
    (*env)->ReleaseStringUTFChars(env, message, c_message);
}

在上述示例中,我们实现了native方法Java_NativeExample_printMessage,并使用printf函数打印字符串。

然后,我们可以使用Java的JNI工具链将C/C++代码编译为本地库。例如,在Linux下,我们可以使用以下命令:

gcc -shared -fpic -o libmylib.so NativeExample.c

在上述命令中,我们使用gcc编译器将C代码编译为libmylib.so本地库。

  1. 运行Java程序
    编译并运行Java程序时,要确保本地库存在于运行时的库路径中。可以通过指定java.library.path系统属性来设置库路径。

例如,在Linux下,可以使用以下命令运行Java程序:

java -Djava.library.path=. NativeExample

在上述命令中,我们将当前目录(.)添加到库路径,并通过NativeExample

    Menggunakan kelas java.lang.Process

    Kelas java.lang.Process ialah kelas abstrak yang mewakili proses pelaksanaan. Ia menyediakan satu siri kaedah untuk mendapatkan aliran input/output proses, tunggu proses selesai, dsb.

    Berikut ialah contoh yang menunjukkan cara menggunakan kelas java.lang.Process untuk melaksanakan arahan sistem pengendalian:

    rrreee

    Dalam contoh di atas, kami gunakan ProcessBuilder mencipta proses dan melaksanakan perintah sistem pengendalian melalui kaedah start(). Kemudian, kita membaca output arahan melalui BufferedReader.

    #🎜🎜# 2. JNI (Antara Muka Asli Java) #🎜🎜# Jika kita perlu mengakses fungsi peringkat rendah, seperti antara muka perkakasan atau fungsi sistem pengendalian tertentu, kita boleh menggunakan JNI. JNI ialah mekanisme untuk program Java berinteraksi dengan kod C/C++ yang mendasari. #🎜🎜##🎜🎜#Berikut ialah contoh mudah yang menunjukkan cara menggunakan JNI untuk melaksanakan teknologi asas Java: #🎜🎜##🎜🎜##🎜🎜#Mencipta kelas Java dan kaedah Asli #🎜🎜#Pertama, kami Kaedah asli perlu diisytiharkan dalam kelas Java untuk melaksanakan fungsi berkaitan di bahagian bawah. Kemudian, kami melaksanakan fungsi asas dengan melaksanakan kaedah asli ini dalam perpustakaan asli. #🎜🎜##🎜🎜##🎜🎜#Berikut ialah contoh kelas Java: #🎜🎜#rrreee#🎜🎜#Dalam contoh di atas, kami mengisytiharkan kaedah asli printMessage dan lulus Kaedah System.loadLibrary() memuatkan perpustakaan tempatan. Kemudian, panggil kaedah asli ini dalam kaedah utama. #🎜🎜#
      #🎜🎜#Buat perpustakaan tempatan #🎜🎜#Di perpustakaan tempatan, kita boleh menggunakan bahasa C/C++ untuk melaksanakan kaedah asli. Kemudian, kita mesti menggunakan fail pengepala standard JNI Java jni.h untuk menyusun pustaka asli. #🎜🎜##🎜🎜##🎜🎜#Berikut ialah contoh perpustakaan asli: #🎜🎜#rrreee#🎜🎜#Dalam contoh di atas, kami melaksanakan kaedah asli Java_NativeExample_printMessage dan digunakan fungsi printf mencetak rentetan. #🎜🎜##🎜🎜# Kemudian, kita boleh menggunakan rantai alat JNI Java untuk menyusun kod C/C++ ke dalam perpustakaan asli. Sebagai contoh, di bawah Linux, kita boleh menggunakan arahan berikut: #🎜🎜#rrreee#🎜🎜# Dalam arahan di atas, kami menggunakan pengkompil gcc untuk menyusun kod C ke dalam libmylib. jadiPustaka tempatan. #🎜🎜#<ol start="3">#🎜🎜#Jalankan program Java #🎜🎜#Apabila menyusun dan menjalankan program Java, pastikan perpustakaan tempatan wujud dalam laluan perpustakaan masa jalan. Laluan perpustakaan boleh ditetapkan dengan menentukan harta sistem <code>java.library.path. #🎜🎜##🎜🎜##🎜🎜#Sebagai contoh, di bawah Linux, anda boleh menggunakan arahan berikut untuk menjalankan program Java: #🎜🎜#rrreee#🎜🎜#Dalam arahan di atas, kami menukar direktori semasa ( .) ke laluan perpustakaan dan tentukan kelas Java untuk dijalankan melalui <code>NativeExample. #🎜🎜##🎜🎜#Ringkasan#🎜🎜#Melalui panggilan sistem pengendalian dan JNI, kami boleh melaksanakan teknologi asas Java dan mengakses fungsi asas sistem pengendalian. Panggilan sistem pengendalian membolehkan kami mengakses sistem pengendalian menggunakan API peringkat tinggi, manakala JNI membolehkan kami menulis kod peringkat rendah dan memanggilnya dalam program Java. #🎜🎜##🎜🎜#Perlu diingatkan bahawa anda harus berhati-hati apabila menggunakan teknologi asas untuk memastikan keselamatan dan kebolehpercayaan kod. #🎜🎜##🎜🎜# Saya harap artikel ini akan membantu anda memahami cara menggunakan panggilan sistem pengendalian dan JNI untuk melaksanakan teknologi asas Java. Jika anda mempunyai sebarang soalan, sila berasa bebas untuk bertanya. #🎜🎜#

Atas ialah kandungan terperinci Cara melaksanakan panggilan sistem pengendalian dan teknologi asas JNI Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn