air调用java,AIR2.0入门教程:与Java应用交互
在之前的一篇文章中,我介紹了如何使用AIR2.0新增的NativeProcess類與本地進程進行交互和通訊,在那個例子里面我們使用了C++ 的代碼,實際上只要是基于命令行的標準輸入輸出,AIR2.0的應用是可以和任何語言編寫的本地進程進行交互的。在今天的例子中,我們將學習如何和 Java編寫的本地進程(.jar文件)進行交互。
上一篇教程的地址:AIR2.0入門教程[三]:與本地進程的數據通訊
注:這篇文章所涉及的源碼和示例來自于Mihai的一篇文章 。
回顧
在AIR2.0中,我們可以使用NativeProcess 和NativeProcessInfo 這兩個類,來啟動一個可執(zhí)行文件。當進程啟動后,你就可以使用標準輸入和標準輸入來與進程通訊。
結合Java
首先,你可以下載示例項目 ,這個項目包含了兩個部分:
AIR部分:是一個基于Flex4 Framework的AIR項目,實現(xiàn)了用戶界面(UI)部分的工作,界面包含兩個窗口,如下圖所示,右邊的窗口是主窗口,你可以看到當前的幀頻,然后你 還可以控制左側的滾動條來放大和縮小右側的圖像。左邊的窗口則用來顯示遮蓋區(qū)域的圖像。
Java部分:控制定位到屏幕的特定區(qū)域,然后捕獲截圖,這個部分被AIR部分所控制。
示例截圖:
你可以使用Flash Builder4,將下載的示例項目導入,編譯運行看一下結果,注意這個項目使用了Flex4的Framework,而且有可能需要你修改SDK的配置,參見第一篇AIR2.0教程 。
在AIR部分的代碼中,我們需要創(chuàng)建一個NativeProcess的實例來注冊偵聽標準輸出事件。首先我們需要調用Java命令,啟動我們的.jar文件,然后輸入“take”命令來獲取屏幕截圖
private var nativeProcess:NativeProcess;
private var npInfo:NativeProcessStartupInfo;
//啟動進程,并輸入參數
var arg:Vector.= new Vector.;
arg.push("-jar");
arg.push(File.applicationDirectory.resolvePath("screenshot.jar").nativePath);
arg.push("130");
arg.push("100");
npInfo = new NativeProcessStartupInfo();
//設置Java的路徑
npInfo.executable = new File("/Library/Java/Home/bin/java");
npInfo.arguments = arg;
nativeProcess = new NativeProcess();
nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOutputData);
//start the process
nativeProcess.start(npInfo);
/**
* 從標準輸出流中讀取數據
* 在讀取PNG之前,首先需要讀取圖片的尺寸
*/
private function onStandardOutputData(e:ProgressEvent):void
{
//reading the available bytes from the standard output buffer of the process
nativeProcess.standardOutput.readBytes(_processBuffer, _processBuffer.length, ??? nativeProcess.standardOutput.bytesAvailable);
...
}
//向Java進程發(fā)送take命令
nativeProcess.standardInput.writeMultiByte("take/n", "utf-8");
下面的部分是Java代碼,你可以看到,它執(zhí)行截取屏幕的工作,然后輸出字節(jié)數組,AIR部分將會把字節(jié)數組還原為圖片并顯示出來:
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 static int width = 130;
private static int height = 110;
private static int x = 50;
private static int y = 50;
private Robot robot;
/**
* 要創(chuàng)建的圖片的類型,可以是PNG,GIF或其它
*/
private String imageType = "png";
/**
* @param 捕捉屏幕寬度
* @param 捕捉屏幕高度
* @param args
*/
public static void main(String[] args) {
if (args.length == 2) {
width = Integer.parseInt(args[0]);
height = Integer.parseInt(args[1]);
}
ScreenShot s = new ScreenShot();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String text = "";
String[] tokens;
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) {
System.err.println("Exception while reading the input. " + e);
}
}
}
/**
* 獲取屏幕某個區(qū)域的截圖
*/
public void capturePortion(int x, int y, int w, int h) {
try {
if (robot == null)
robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(img, imageType, output);
DataOutputStream dataOutputStream = new DataOutputStream(System.out);
//輸出流的長度
dataOutputStream.writeInt(output.size());
//輸出流
dataOutputStream.write(output.toByteArray());
dataOutputStream.flush();
output.close();
} catch (AWTException e) {
System.err.println("Exception while capturing screen. " + e);
} catch (IOException e) {
System.err.println("Exception while writting the image bytes. " + e);
}
}
}
通過上面的代碼,你已經了解了如何將Java進程與AIR應用相結合,接下來就是打包你的AIR應用為本地可執(zhí)行文件,這樣才具備與本地進程通訊的權限,詳情請參閱上一篇教程:
總結
以上是生活随笔為你收集整理的air调用java,AIR2.0入门教程:与Java应用交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我到底应该换那个宠物
- 下一篇: ado控件连接oracle,在Delph