我希望能够从我的AIR应用程序中操作扫描仪。由于本机不支持,我正在尝试使用NativeProcess类来启动可以运行扫描程序的jar文件。 Java代码使用JTwain库来操作扫描程序。 Java应用程序本身运行良好,AIR应用程序可以启动并与Java应用程序通信。问题似乎是,每当我尝试使用JTwain中的函数(依赖于JTwain.dll)时,应用程序就会在AIR AIRED IT IT中死掉。
我不确定从本机进程引用dll文件还是有什么限制。我在下面加了我的代码
Java代码 -
while(true)
{
try {
System.out.println("Start");
text = in.readLine();
Source source = SourceManager.instance().getCurrentSource();
System.out.println("Java says: "+ text);
}
catch (IOException e)
{
System.err.println("Exception while reading the input. " + e);
}
catch (Exception e) {
System.out.println("Other exception occured: " + e.toString());
}
finally {
}
}
}
空气应用 -
import mx.events.FlexEvent;
private var nativeProcess:NativeProcess;
private var npInfo:NativeProcessStartupInfo;
private var processBuffer:ByteArray;
private var bLength:int = 0;
protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void
{
var arg:Vector.<String> = new Vector.<String>;
arg.push("-jar");
arg.push(File.applicationDirectory.resolvePath("Hello2.jar").nativePath);
processBuffer = new ByteArray;
npInfo = new NativeProcessStartupInfo;
npInfo.executable = new File("C:/Program Files/Java/jre6/bin/javaw.exe");
npInfo.arguments = arg;
nativeProcess = new NativeProcess;
nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOutputData);
nativeProcess.start(npInfo);
}
private function onStandardOutputData(e:ProgressEvent):void
{
tArea.text += nativeProcess.standardOutput.readUTFBytes(nativeProcess.standardOutput.bytesAvailable);
}
protected function button1_clickHandler(event:MouseEvent):void
{
tArea.text += 'AIR app: '+tInput.text + '\n';
nativeProcess.standardInput.writeMultiByte(tInput.text + "\n", 'utf-8');
tInput.text = '';
}
protected function windowedapplication1_closeHandler(event:Event):void
{
nativeProcess.closeInput();
}
]]>
</fx:Script>
<s:Button label="Send" x="221" y="11" click="button1_clickHandler(event)"/>
<s:TextInput id="tInput" x="10" y="10" width="203"/>
<s:TextArea id="tArea" x="10" width="282" height="88" top="40"/>
我很想解释为什么这会死亡。我做了足够的测试,我完全知道杀死它的行是SourceManager.instance()。getCurrentSource()。我会喜欢任何建议。感谢。
答案 0 :(得分:1)
调用Java时,将-Djava.library.path = location_of_dll添加到命令行
答案 1 :(得分:0)
我对Air有0次经验,但这让我想起了曾经花了一些时间搞清楚的Java问题。我没有关于为什么扫描不起作用的建议,但我认为堆栈跟踪将是你现在最好的朋友。
我猜你是依靠这条线捕捉并展示它的?
nativeProcess.standardOutput.readUTFBytes(nativeProcess.standardOutput.bytesAvailable);
但是,您正在向IOExceptions
撰写System.err
- 您可以在Air中阅读nativeProcess.standardError
吗?或者,将所有内容输出到System.out
。