Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从AdobeAIR';运行带有.dll的Java程序;自然过程_Java_Apache Flex_Process_Air_Native - Fatal编程技术网

从AdobeAIR';运行带有.dll的Java程序;自然过程

从AdobeAIR';运行带有.dll的Java程序;自然过程,java,apache-flex,process,air,native,Java,Apache Flex,Process,Air,Native,我希望能够从我的AIR应用程序中操作扫描仪。由于本机不支持此功能,因此我尝试使用NativeProcess类启动一个可以运行扫描仪的jar文件。Java代码使用JTwain库来操作扫描仪。Java应用程序本身运行良好,AIR应用程序可以启动并与Java应用程序通信。问题似乎是,每当我尝试使用来自JTwain(依赖于JTwain.dll)的函数时,如果AIR启动它,应用程序就会死亡 我不确定从本机进程引用dll文件是否有一些限制。我在下面包含了我的代码 Java代码- while(true

我希望能够从我的AIR应用程序中操作扫描仪。由于本机不支持此功能,因此我尝试使用NativeProcess类启动一个可以运行扫描仪的jar文件。Java代码使用JTwain库来操作扫描仪。Java应用程序本身运行良好,AIR应用程序可以启动并与Java应用程序通信。问题似乎是,每当我尝试使用来自JTwain(依赖于JTwain.dll)的函数时,如果AIR启动它,应用程序就会死亡

我不确定从本机进程引用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 {
        }
    }   
}
空气应用-
导入mx.events.FlexEvent;
私有var nativeProcess:nativeProcess;
私有var npInfo:NativeProcessStartupInfo;
私有var进程缓冲区:ByteArray;
私有变量bLength:int=0;
受保护的函数windowedapplication1\u applicationCompleteHandler(事件:FlexEvent):无效
{
变量arg:Vector.=新向量。;
参数推送(“-jar”);
arg.push(File.applicationDirectory.resolvePath(“Hello2.jar”).nativePath);
processBuffer=新字节数组;
npInfo=新的NativeProcessStartupInfo;
npInfo.executable=新文件(“C:/ProgramFiles/Java/jre6/bin/javaw.exe”);
npInfo.arguments=arg;
nativeProcess=新的nativeProcess;
nativeProcess.addEventListener(ProgressEvent.STANDARD_输出数据,标准输出数据);
nativeProcess.start(npInfo);
}
标准输出数据上的私有函数(e:ProgressEvent):void
{
tArea.text+=nativeProcess.standardOutput.readUTFBytes(nativeProcess.standardOutput.bytesAvailable);
}
受保护的功能按钮1\u clickHandler(事件:MouseeEvent):无效
{
tArea.text+='AIR应用程序:'+tInput.text+'\n';
nativeProcess.standardInput.writeMultiByte(tInput.text+“\n”,“utf-8”);
tInput.text='';
}
受保护的函数windowedapplication1\u closeHandler(事件:事件):无效
{
nativeProcess.closeInput();
}
]]>


我想解释一下为什么这会死。我已经做了足够多的测试,我完全知道杀死它的那一行是SourceManager.instance().getCurrentSource()。我希望得到任何建议。谢谢。

我对Air有0点经验,但这让我想起了一个Java问题,我曾经花了一些时间来解决这个问题。我不知道为什么扫描不起作用,但我认为堆栈跟踪现在是你最好的朋友

我猜你是靠这条线来捕捉和显示它的吧

nativeProcess.standardOutput.readUTFBytes(nativeProcess.standardOutput.bytesAvailable);

但是,您正在将
IOExceptions
写入
System.err
-是否存在可以在空中读取的
nativeProcess.standardError
?或者,当调用Java时,将所有内容输出到
System.out

将this-Djava.library.path=location\u of_dll添加到命令行

否。当Java应用程序在Flex调用中死亡时,两个catch语句似乎都没有被命中。它只是悄无声息地消失。暂时将DLL放入windows系统文件夹(确保没有覆盖任何内容),然后重试。这会告诉你,如果你有路径问题,你能在stderr上放一个侦听器吗?这样得到堆栈跟踪?我把DLL放在Windows\System文件夹中-没有区别。我使用nativeProcess.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,onStandardErrorData)为stderr添加了一个侦听器;仍然没有听到任何回音。谢谢。@Donny你试着把DLL放到windows系统目录了吗?我把异常改为输出到stdout,并在Flex端为stderr添加了一个监听器。仍然没有回复。你的AIR应用程序是否显示“开始”?是的。如果我去掉SourceManager行,那么Java应用程序只会回显它在stdin上接收到的任何内容,并添加绝对路径作为命令行参数,就像这样。还是没什么,你完全解决了。我误解并使用了C:\Program Files\JTwain\AspriseJTwain.dll,而我本应该只提供目录C:\Program Files\JTwain。为了让大家都清楚,修复方法是在我的代码中添加arg.push(“-Djava.library.path=C”\\Program Files\\JTwain”);谢谢!
nativeProcess.standardOutput.readUTFBytes(nativeProcess.standardOutput.bytesAvailable);