在之前的一篇文章中,我介绍了如何使用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”命令来获取屏幕截图

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进程发送take命令

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 static int width = 130;

private static int height = 110;

private static int x = 50;

private static int y = 50;

private Robot robot;

/**

* 要创建的图片的类型,可以是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);

}

}

}

/**

* 获取屏幕某个区域的截图

*/

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应用为本地可执行文件,这样才具备与本地进程通讯的权限,详情请参阅上一篇教程:

air调用java,AIR2.0入门教程:与Java应用交互相关推荐

  1. Java开发新手入门教程!java二维数组输出九九乘法表

    一.java基础面试知识点 java中==和equals和hashCode的区别 int.char.long各占多少字节数 int与integer的区别 探探对java多态的理解 String.Str ...

  2. Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12

    目录 相关教程 环境配置 0基础上手例子(C/C++) 使用CMake的例子(C语言) 使用CMake的例子(C++) 本文主要是手把手教萌新们如何用官方用例构建(有许多本人亲身踩坑血泪史) 相关教程 ...

  3. RxJava 2.0 入门教程

    RxJava 2.0 入门教程 RxJava 2.0 是来自NetFlix的开源java异步编程框架.和java 8 lambda表达式很接近,响应式编程的基本构建快是被观察对象(Observable ...

  4. Java基础小白入门教程-----百知教育java基础学习1---胡鑫喆

    Java基础小白入门教程(胡大大出品,彩蛋请自寻) 胡鑫喆 https://www.bilibili.com/video/BV1wE411V7Zo?from=search&seid=38511 ...

  5. pip更新失败_最全Tensorflow2.0 入门教程持续更新

    最全Tensorflow 2.0 入门教程持续更新: Doit:最全Tensorflow 2.0 入门教程持续更新​zhuanlan.zhihu.com 完整tensorflow2.0教程代码请看ht ...

  6. creo如何更改打开时显示方式_Creo4.0入门教程(3):设置工作目录和打开以及保存文件...

    原标题:Creo4.0入门教程(3):设置工作目录和打开以及保存文件 目标: 1.设置工作目录 2.文件的打开和保存 1.设置工作目录 工作目录是打开和保存文件的指定位置.通常默认工作目录为启动 Cr ...

  7. c语言编程:vc++6.0入门教程及习题_百度文库,C语言编程:vc++6.0入门教程及习题.doc...

    C语言编程:vc++6.0入门教程及习题.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址 ...

  8. matlab 7.1教程pdf,MATLAB7[1].0入门教程.ppt

    <MATLAB7[1].0入门教程.ppt>由会员分享,可在线阅读,更多相关<MATLAB7[1].0入门教程.ppt(34页珍藏版)>请在人人文库网上搜索. 1.1/33,2 ...

  9. Web 3.0入门教程

    Web 3.0入门教程 课程英文名:What Is Web3? 此视频教程共5.5小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址 百度网盘地址:​​​​​​​https://pan.baid ...

最新文章

  1. Protobuf windows
  2. (2.10)备份与还原--利用T-SQL进行备份还原
  3. 你需要了解的纯原生JS实现带有功能的前端购物车
  4. Tips:重装系统后Anaconda目录在开始菜单消失问题
  5. 薄壁轴承摩擦力矩_机器人四点接触薄壁轴承详细介绍
  6. leetcode851. 喧闹和富有(dfs)
  7. 【问题记录】RIDE-1.7.3.1控制台及日志中文乱码处理
  8. hdu5693 D gamehdu 5712 D++ game
  9. python flask源码解析_Flask知识全套及源码分析
  10. 轮播中小按钮的切换和高亮效果
  11. 记录Yii2代码调试中出现的两个问题(截图展示)
  12. 详解:Oracle数据库介绍 、字符、类型、语言
  13. Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
  14. C#:根据特定分隔符分割字符串
  15. 非常赞的文章!告诉你一个你知其然却不知其所以然的硅谷
  16. 乌班图系统安装谷歌浏览器
  17. Spring AOP中的责任链设计模式
  18. 小觅深度相机标准版 ROS使用
  19. 编写Dockerfile来构建nginx:latest镜像
  20. WC-Write Combining 合并写技术

热门文章

  1. 用OpenCV进行摄像机标定
  2. Caffe框架GPU与MLU计算结果不一致请问如何调试?
  3. 三维点云去噪无监督学习:ICCV2019论文分析
  4. Python:新浪网分类资讯爬虫
  5. CentOS 8 安装图解
  6. OpenCV error: Cannot load info library for OpenCV
  7. ERROR: Failed to resolve: com.android.databinding:library:3.4.2
  8. Taylayout 底部的滑动线高度设置
  9. 并发编程的那些事。(二)
  10. Java后端WebSocket的Tomcat实现