Запуск Java-программы с использованием DLL из собственного процесса Adobe AIR - PullRequest
2 голосов
/ 18 июня 2010

Я хотел бы иметь возможность управлять сканером из моего приложения AIR.Поскольку изначально это не поддерживается, я пытаюсь использовать класс NativeProcess для запуска файла JAR, который может запустить сканер.Код Java использует библиотеку JTwain для работы сканера.Приложение Java работает нормально, и приложение AIR может запускаться и взаимодействовать с приложением Java.Кажется, проблема в том, что всякий раз, когда я пытаюсь использовать функцию из JTwain (которая опирается на JTwain.dll), приложение умирает, ЕСЛИ ВОЗДУХ НАЧИНАЕТСЯ.

Я не уверен, есть ли какое-то ограничениессылки на 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 ().Я буду рад любым предложениям.Спасибо.

Ответы [ 2 ]

1 голос
/ 18 июня 2010

При вызове Java добавьте -Djava.library.path = location_of_dll в командную строку

0 голосов
/ 18 июня 2010

У меня 0 опыта работы с Air, но это напомнило мне о проблеме с Java, которую я однажды потратил на выяснение.У меня нет предположения о том, почему сканирование не работает, но я думаю, что трассировка стека будет вашим лучшим другом прямо сейчас.

Я предполагаю, что вы полагаетесь на эту строку для захвата ипоказать это?

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

Однако вы пишете IOExceptions в System.err - есть ли nativeProcess.standardError, который вы могли бы прочитать в эфире?В качестве альтернативы выведите все в System.out.

...