也谈在Java中调用其它的程序

 

前一段时间看了《程序员》第3Java专家门诊中怎样调用其它的程序,我把其解答代码放到一个程序中,如下示:

import java.lang.*;

 

public class runProg{

public static void main(String[] args){

       try{

         Runtime rt=Runtime.getRuntime();

         rt.exec("NotePad");

       }catch(Exception e){}

}

}

 

 

 

 

 

 

 

 

 

 

 

 


在命令符下编译运行,直接调用了记事本应用程序,没有任何问题。

但在图形用户的应用程序中,就不能编译,代码示例如下:

  void jButton1_actionPerformed(ActionEvent e) {

    //下是解答代码

try{

       Runtime rt=Runtime.getRuntime();

       rt.exec("NotePad");

    }catch(Exception e){

}

//上是解答代码

  }

 

 

 

 

 

 

 

 

 

 

 


就上面的代码而言,只是说明了调用其它程序的基本方法,但是这段代码根本不能被编译过去,在Jbuilder中的编译错误如下:

"Frame2.java": Error #: 469 : variable e is already defined in method jButton1_actionPerformed(java.awt.event.ActionEvent) at line 50, column 18

 

 

 

 


看到这个编译错误也许认为是按钮的事件定义错误,实际上是AWTComponent的事件是线程安全级的,不允许直接使用另外进程或线程,因Swing中的组件是从AWT中继承来的,所以也不允许直接使用。解决办法只有使用一个新线程。代码如下示:

  void jButton1_actionPerformed(ActionEvent e) {

    //must be use a new thread.

    Thread t = new Thread(new Runnable(){

    public void run(){

      try {

        Runtime rt = Runtime().getRuntime();

        rt.exec(“notepad”);

        } catch (IOException e) {

        System.err.println("IO error: " + e);

      }

    }

    });

    t.start();

 

  }

但是这段代码还是不能被编译,错误提示如下:

"Frame1.java": Error #: 300 : method Runtime() not found in anonymous class of method jButton1_actionPerformed(java.awt.event.ActionEvent) at line 74, column 22

 

 

 

 


看到这段代码,认为没有发现Runtime(),或者没有包含Runtime所在的包。但实际上是java每个Application都有一个自己的Runtime,所以不允许显式声明和使用另外一个。其实,许多文章也都是这么介绍的。在这里必须使用Process来启用另外一个进程使用Runtime。代码示例如下:

  void jButton1_actionPerformed(ActionEvent e) {

    //must be use a new thread.

    Thread t = new Thread(new Runnable(){

    public void run(){

      try {

        //String[] arrCommand = {"javaw", "-jar", "d:/Unicom/Salary/Salary.jar"};

              // Process p = Runtime.getRuntime().exec(arrCommand);

        Process p = Runtime.getRuntime().exec("notepad");

        p.waitFor();

        System.out.println("return code: " + p.exitValue());

      } catch (IOException e) {

        System.err.println("IO error: " + e);

      } catch (InterruptedException e1) {

        System.err.println("Exception: " + e1.getMessage());

      }

    }

    });

    t.start();

 

  }

运行后,点击jButton1调用了Windows中的记事本应用程序。这里,新线程使用了Runnable接口,这是一种常用的技巧。另外,还必须要捕获IOExceptionInterruptedException两个异常。对于调用带有参数的复杂程序,要使用字符串数组代替简单的字符串,我在上面的代码注释了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java程序调用GPIO信号的读写,需要使用Java Native Interface(JNI)技术,将Java代码和C语言代码相结合。具体步骤如下: 1. 编写C语言函数库 编写C语言函数库,实现GPIO信号的读写操作。函数库需要包含在Java程序进行调用,可以使用System.loadLibrary()方法加载动态链接库。 2. 定义Java本地接口 在Java程序定义Java本地接口,将Java代码和C语言代码相连接。本地接口需要使用native关键字声明,如下所示: ``` public class GPIO { public native int gpioRead(int pin); public native void gpioWrite(int pin, int value); static { System.loadLibrary("gpio"); } } ``` 在上面的代码,gpioRead和gpioWrite方法是调用C语言函数库实现的GPIO信号读写操作的Java本地接口。 3. 编写C语言函数 编写C语言函数,实现GPIO信号的读写操作。函数需要使用Java本地接口声明的参数和返回值类型,如下所示: ``` JNIEXPORT jint JNICALL Java_GPIO_gpioRead(JNIEnv *env, jobject obj, jint pin) { // 读取GPIO信号的值 return value; } JNIEXPORT void JNICALL Java_GPIO_gpioWrite(JNIEnv *env, jobject obj, jint pin, jint value) { // 写入GPIO信号的值 } ``` 在上面的代码Java_GPIO_gpioRead和Java_GPIO_gpioWrite函数是实现GPIO信号读写操作的C语言函数。参数env和obj是JNI环境和Java对象,pin和value是GPIO信号的编号和值。 4. 编译和打包Java程序 使用javac命令编译Java程序,生成.class文件。使用jar命令打包Java程序,生成.jar文件。 5. 编译C语言函数库 使用gcc命令编译C语言函数库,生成.so文件。在编译命令需要包含Java头文件和JNI库文件,如下所示: ``` gcc -shared -fpic -o libgpio.so gpio.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JAVA_HOME}/jre/lib/amd64/server -ljvm ``` 在上面的命令,-I选项指定Java头文件的路径,-L选项指定JNI库文件的路径,-ljvm选项指定JNI库文件的名称。 6. 运行Java程序 使用java命令运行Java程序,即可调用GPIO信号的读写操作。 总之,通过JNI技术,Java程序可以调用C语言函数库实现的GPIO信号读写操作,实现对GPIO信号的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值