AIR2.0入门教程[五]:与Java应用交互
在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的应用是可以和任何语言编写的本地进程进行交互的。在今天的例子中,我们将学习如何和Java编写的本地进程(.jar文件)进行交互。
上一篇教程的地址:AIR2.0入门教程[三]:与本地进程的数据通讯
注:这篇文章所涉及的源码和示例来自于Mihai的一篇文章。
回顾
在AIR2.0中,我们可以使用NativeProcess和NativeProcessInfo这两个类,来启动一个可执行文件。当进程启动后,你就可以使用标准输入和标准输入来与进程通讯。
结合Java
首先,你可以下载示例项目,这个项目包含了两个部分:
- AIR部分:是一个基于Flex4 Framework的AIR项目,实现了用户界面(UI)部分的工作,界面包含两个窗口,如下图所示,右边的窗口是主窗口,你可以看到当前的帧频,然后你还可以控制左侧的滚动条来放大和缩小右侧的图像。左边的窗口则用来显示遮盖区域的图像。
- Java部分:控制定位到屏幕的特定区域,然后捕获截图,这个部分被AIR部分所控制。
示例截图:

你可以使用Flash Builder4,将下载的示例项目导入,编译运行看一下结果,注意这个项目使用了Flex4的Framework,而且有可能需要你修改SDK的配置,参见第一篇AIR2.0教程。
在AIR部分的代码中,我们需要创建一个NativeProcess的实例来注册侦听标准输出事件。首先我们需要调用Java命令,启动我们的.jar文件,然后输入“take”命令来获取屏幕截图
1: private var nativeProcess:NativeProcess; 2: private var npInfo:NativeProcessStartupInfo; 3: //启动进程,并输入参数 4: var arg:Vector.<String> = new Vector.<String>; 5: arg.push("-jar"); 6: arg.push(File.applicationDirectory.resolvePath("screenshot.jar").nativePath); 7: arg.push("130"); 8: arg.push("100"); 9: 10: npInfo = new NativeProcessStartupInfo(); 11: //设置Java的路径 12: npInfo.executable = new File("/Library/Java/Home/bin/java"); 14: 15: nativeProcess = new NativeProcess(); 17: //start the process 18: nativeProcess.start(npInfo); 19: 20: /** 21: * 从标准输出流中读取数据 22: * 在读取PNG之前,首先需要读取图片的尺寸 23: */ 25: //reading the available bytes from the standard output buffer of the process 26: nativeProcess.standardOutput.readBytes(_processBuffer, _processBuffer.length, nativeProcess.standardOutput.bytesAvailable); 27: ... 28: } 29: 30: //向Java进程发送take命令 31: nativeProcess.standardInput.writeMultiByte("take\n", "utf-8");
下面的部分是Java代码,你可以看到,它执行截取屏幕的工作,然后输出字节数组,AIR部分将会把字节数组还原为图片并显示出来:
package org.corlan; import java.awt.AWTException; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import javax.imageio.ImageIO; public class ScreenShot { private Robot robot; /** * 要创建的图片的类型,可以是PNG,GIF或其它 */ /** * @param 捕捉屏幕宽度 * @param 捕捉屏幕高度 * @param args */ if (args.length == 2) { width = Integer.parseInt(args[0]); height = Integer.parseInt(args[1]); } ScreenShot s = new ScreenShot(); while (true) { try { text = in.readLine(); if (text.equals("take")) { s.capturePortion(x, y, width, height); } else if (text.equals("terminate")) { return; } else if (text.length() > 0) { tokens = text.split("\\|"); if (tokens.length < 4) continue; x = Integer.parseInt(tokens[0]); y = Integer.parseInt(tokens[1]); width = Integer.parseInt(tokens[2]); height = Integer.parseInt(tokens[3]); } } catch (IOException e) { } } } /** * 获取屏幕某个区域的截图 */ try { if (robot == null) robot = new Robot(); ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageIO.write(img, imageType, output); //输出流的长度 dataOutputStream.writeInt(output.size()); //输出流 dataOutputStream.write(output.toByteArray()); dataOutputStream.flush(); output.close(); } catch (AWTException e) { } catch (IOException e) { } } }
通过上面的代码,你已经了解了如何将Java进程与AIR应用相结合,接下来就是打包你的AIR应用为本地可执行文件,这样才具备与本地进程通讯的权限,详情请参阅上一篇教程:
上一篇教程的地址:AIR2.0入门教程[三]:与本地进程的数据通讯

.gif)
.gif)




.gif)
我该怎么关闭它呢~~?
我用java截完图片之后怎么把java进程关闭啊?否则总是会在进程里~
打开程序出现java命令框
每次打开程序的时候总会出现那个命令框怎么解决啊~~
确实是个问题,目前
确实是个问题,目前似乎还没有解决方法
发表新评论