📜  多语言编程Java进程类、JNI 和 IO

📅  最后修改于: 2022-05-13 01:55:01.721000             🧑  作者: Mango

多语言编程Java进程类、JNI 和 IO

顾名思义,多语言编程涉及在单个程序中使用多种编程语言。有大量的编程语言,我们希望我们也可以使用其他语言的组件,这是一种常见的体验。好吧,在第一次尝试时,使用多种语言,用多种语言编译代码似乎很奇怪,但归根结底,它非常有用。

在深入研究细节和基于代码的东西之前,让我们先回顾一下编程语言的历史Java的历史和操作系统的历史。汇编级编程语言出现在 1940 年代。 1951 年 – 区域汇编语言应运而生。 1958 年 – 阿尔戈; 1959年- COBOL于1964年(面向商业的通用语言),最后BASIC(初学者通用符号指令代码)最后,我们在1972年得到了C Python而排在1990年,但它只是由于出现了当前最为流行数据科学和机器学习技术。 Java于 1995 年问世。其他语言,如 Go、Rust、Dark、Kotlin、Swift、Scala、Scratch 等,都是最近的发展。现在,我为什么要说这些?这似乎与讨论的主题无关,但实际上并非如此。

不同的编程语言有不同的能力是可以接受的。例如,C 和 C++ 支持指针; Python适用于数据科学和基于 AI 的领域; R 非常适合数据分析和数学运算。从我个人的经验来说,BASIC 是我使用的第一语言,就像 2011 年一样。(我主要使用 QBASIC)。虽然 QBASIC 是一种解释型语言,但我后来转向 QB64,它是 BASIC 的现代化版本,它主要编译并生成 EXE 文件。除此之外,有时我们还使用机器可执行脚本来实现某些目标。例如,用于切换计算机蓝牙的 bash 脚本、用于与连接的外围设备通信的 bat 文件等等。

现在,有时您可能会想,“天哪!我希望语言 X 的这种特性也存在于语言 Y 中。”很多时候我们都遇到过。但是现在,随着工艺类,JNI,和IO在Java中的帮助下,我们可以使用的所有功能在Java中的任何编程语言,提供相同的已安装在机器上,与依赖一起。例如,我们可以使用Python OpenCV 或来自Java的Python文本到语音 (PyTTSx3) 库。

执行:



一个从Java运行文本到语音引擎的简短程序。它由两个文件组成,即Python和 GFG 的 tt.py。Java的Java。

Fie 1: tts.py

Python3
# Python Demo Program
 
# System for reading command line arguments
import sys 
# Our Text to speech module
import pyttsx3 
 
if __name__ == "__main__":
    engine = pyttsx3.init()
 
    # Command line inputs saved in arg
    for arg in sys.argv[1:]: 
         
        # Speaking the input
        engine.say(arg) 
        engine.runAndWait()


Java
// Java Program to Run a Text to Speech Engine
 
// Importing I/O classes
import java.io.*;
 
// Main class
class GFG
{
    // Main driver method
    public static void main(String args[])
    {
        // Custom input string consisting of text to speak
        String str= "Hello world";
       
        // Try block to handle the exceptions 
        try
        {
             Process ec=Runtime.getRuntime().exec("python tts.py "+str); //Using str as command line argument for the python script
             ec.waitFor(); //Waiting for the python script to finish executing
        }
        catch(Exception excep)
        {
             excep.printStackTrace();
        }
    }
}


Python3
# Importing required python classes
import sys
import pyttsx3
 
if __name__ == "__main__":
    engine = pyttsx3.init()
 
    # Iterating over using for loop
    for arg in sys.argv[1:]
    engine.say(arg)
    engine.runAndWait()
 
    # Print to STDOUT of python script
    print("Execution from Python completed")


Java
// Importing java I/O classes
import java.io.*;
 
// Main class
class GFG {
 
    // MAin driver method
    public static void main(String args[])
    {
        // Custom input string
        String str = "Hello world";
 
        // Try block to check for exceptions
        try {
            // Creating object of Processor class for python
            // script
            Process ec = Runtime.getRuntime().exec(
                "python tts.py " + str);
 
            // Taking input from user by
            // creating object of BufferedReader class
            // as for less salalbilty it is fast
 
            // Connect STDOUT of Python script to
            // BufferedReader of Java
            BufferedReader br = new BufferedReader(
                new InputStreamReader(ec.getInputStream()));
 
            // Initially declaring and initializing empty
            // string
            String st = " ";
 
            // Read all outputs from python script
            while ((st = br.readLine()) != null) {
                // Printing them
                System.out.println(st);
            }
 
            ec.waitFor();
        }
 
        // Catch block to handle the exceptions
        catch (Exception excep) {
 
            // Print the exception/s along twith line number
            // using pprintStacktrace() method
            excep.printStackTrace();
        }
    }
}


Java
// Java Program to Shut-Down the Computer
 
// Importing input output classes
import java.io.*;
 
// Main class
class GFG {
   
    // Main driver method
    public static void main(String args[])
    {
        // Try block to check for exceptions
        try {
            // Windows machine shutdown
            Process ec = Runtime.getRuntime().exec(
                "shutdown -s -f -t 0");
            ec.waitFor();
 
            // LINUX machine shutdown
            ec = Runtime.getRuntime().exec("sudo poweroff");
            ec.waitFor();
        }
 
        // catch block to handle exceptions
        catch (Exception excep) {
           
            // Print and display the exception on the console
            // using printStackTrace() method
            excep.printStackTrace();
        }
    }
}


文件 2: GFG。Java

Java

// Java Program to Run a Text to Speech Engine
 
// Importing I/O classes
import java.io.*;
 
// Main class
class GFG
{
    // Main driver method
    public static void main(String args[])
    {
        // Custom input string consisting of text to speak
        String str= "Hello world";
       
        // Try block to handle the exceptions 
        try
        {
             Process ec=Runtime.getRuntime().exec("python tts.py "+str); //Using str as command line argument for the python script
             ec.waitFor(); //Waiting for the python script to finish executing
        }
        catch(Exception excep)
        {
             excep.printStackTrace();
        }
    }
}

输出:

Hello world (spoken)

好的,现在按照定义,

执行:

可以看出,我们可以将控制流从Java应用程序转移到Python脚本,脚本执行完成后,返回控制流。现在,问题是除了控制流之外,如何传输数据。在这里,I/O 类开始发挥作用。

从Python程序中,我们可以只打印我们想要 STDOUT 的数据。 (在Python使用简单的 print()函数。)现在,Process 类的实例 ec 有一个名为getInputStream()的函数。这将返回Java程序的 InputStream 对象。现在,可以使用 BufferedReader 或 Scanner 类轻松处理来自输入流的输入。 Python类的 STDOUT 连接到 Process 类 Instance 的 Input Stream。

示例 1:文件:tts.py

蟒蛇3

# Importing required python classes
import sys
import pyttsx3
 
if __name__ == "__main__":
    engine = pyttsx3.init()
 
    # Iterating over using for loop
    for arg in sys.argv[1:]
    engine.say(arg)
    engine.runAndWait()
 
    # Print to STDOUT of python script
    print("Execution from Python completed")

示例 2:文件 GFG。Java

Java

// Importing java I/O classes
import java.io.*;
 
// Main class
class GFG {
 
    // MAin driver method
    public static void main(String args[])
    {
        // Custom input string
        String str = "Hello world";
 
        // Try block to check for exceptions
        try {
            // Creating object of Processor class for python
            // script
            Process ec = Runtime.getRuntime().exec(
                "python tts.py " + str);
 
            // Taking input from user by
            // creating object of BufferedReader class
            // as for less salalbilty it is fast
 
            // Connect STDOUT of Python script to
            // BufferedReader of Java
            BufferedReader br = new BufferedReader(
                new InputStreamReader(ec.getInputStream()));
 
            // Initially declaring and initializing empty
            // string
            String st = " ";
 
            // Read all outputs from python script
            while ((st = br.readLine()) != null) {
                // Printing them
                System.out.println(st);
            }
 
            ec.waitFor();
        }
 
        // Catch block to handle the exceptions
        catch (Exception excep) {
 
            // Print the exception/s along twith line number
            // using pprintStacktrace() method
            excep.printStackTrace();
        }
    }
}

输出:

Hello world (Spoken)
Execution from Python completed

输出说明:



执行Java程序时的输出是音频格式的“Hello World”和 STDOUT 中的“从Python执行完成”。现在,我们可能还想从Java程序中执行一些 shell 命令来与系统交互。

示例 3:文件 GFG。Java

Java

// Java Program to Shut-Down the Computer
 
// Importing input output classes
import java.io.*;
 
// Main class
class GFG {
   
    // Main driver method
    public static void main(String args[])
    {
        // Try block to check for exceptions
        try {
            // Windows machine shutdown
            Process ec = Runtime.getRuntime().exec(
                "shutdown -s -f -t 0");
            ec.waitFor();
 
            // LINUX machine shutdown
            ec = Runtime.getRuntime().exec("sudo poweroff");
            ec.waitFor();
        }
 
        // catch block to handle exceptions
        catch (Exception excep) {
           
            // Print and display the exception on the console
            // using printStackTrace() method
            excep.printStackTrace();
        }
    }
}

现在,正如标题所言,JNI 是什么。 JNI 或Java Native Interface 提供了一个接口(一个 .h 头文件),以便我们可以将它包含在我们的 C 和 C++ 程序中,并从我们的Java程序中调用 C 程序中的函数。 C 程序中的函数称为本机函数,因此得名。但是,深入了解 JNI,我们可以在Java定义本地方法,如下图所示。

插图:

native void function(parameters)
{ ... }

这里的native关键字表示要从 C 或 C++ 中定义的外部本机代码访问此特定方法。另一方面,用于使用本机方法编译Java程序。对于较旧的 JDK,我们需要使用javah ,对于最新的 JDK,我们需要使用javac -h 。这将生成一个 .h 头文件,该文件必须包含在带有 #include 预处理器的 C 程序中。我们大多数人通常使用 gcc 编译器,它可以用来将 C 程序编译成.dll 库

static {
System.loadLibrary("library.dll");
}

如果C程序编译成library.dll文件,同样可以像这样导入Java程序。 C 程序中通过包含javac -h生成的.h 头文件定义的函数可以直接调用本机函数。

正如我们所见,Process 类可用于调用用其他语言编写的程序以及 shell 脚本。必须说 Process 类也可以用于与连接的硬件交互,就像机器在Java没有合适的库时一样。在这里,我们主要讨论串行通信设备。

Process 类和在单个项目中使用多种编程语言可以在时间很少并且没有以单一语言提供的适当库时成为救命稻草。例如,我们对Python不是很流利。我们更像是一个Java程序员。因此,我们主要用Java编写程序,但在某些情况下, Python具有更好的库。我们可以轻松地使用 Process 类来调用它们。