System.out.println () перестает работать после вызова JNA / DLL?

У меня в программе несколько вызовов System.out.println (). Моя проблема в том, что после вызова DLL через библиотеку JNA (которая работает без возврата кода ошибки или исключения исключения) последующие вызовы println () выполняются без печати! Я знаю, что операторы выполняются, потому что я прохожу через них в NetBeans!

К сожалению, я не имею понятия о коде C, лежащем в основе DLL, и я предполагаю, что вы не сможете продублировать это, если не зарегистрируетесь на qimaging.com и не загрузите QCam SDK. Мне просто интересно, испытывал ли кто-нибудь что-нибудь подобное этому поведению System.out.println (), т.е. что оно работает до определенного момента, а затем прекращает печать, даже если оно выполняется.

Это мой основной тестовый класс:

package hwi.scope;

import com.sun.jna.ptr.IntByReference;
import hwi.scope.qcam.QCamDriverX64;
import java.io.File;

/**
* QCamTest class tests some functions of the QCam driver library.
* @author rnagel
*/
public class QCamTest
{
    private static QCamDriverX64 driver;

    // Main test method:
    public static void main() throws Exception
    {
        // Set path to easily find DLL in the /dll folder:
        File f = new File("dll");        
        System.setProperty("jna.library.path", f.getCanonicalPath());        

        // Use JNA to load the driver library:
        driver = QCamDriverX64.INSTANCE;

        // Load camera driver from the library:
        loadQCamDriver();

        // Print out the driver version:
        printQCamVersion();
    }

    // Load camera driver method:
    public static void loadQCamDriver()
    {
        System.out.println("Loading QCam driver..."); // Executes and prints to console
        int error = driver.QCam_LoadDriver();        
        System.out.println("Done loading driver."); // Executes, but doesn't print to console
    }

    // Print camera driver version:
    public static void printQCamVersion()
    {
        // Obtain driver version as a combination of 'major' and 'minor' increments:
        IntByReference major = new IntByReference(), minor = new IntByReference();
        int error = driver.QCam_Version(major, minor);

        // At this point, I've verified that I have a obtained a valid version.
        System.out.println("QCam v." + major.getValue() + "." + minor.getValue()); // Executes, but doesn't print to console   
    }
}

А это класс QCamDriverX64, который я сделал для оболочки DLL:

package hwi.scope.qcam;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

/**
 * QCamDriverX64 wraps the 64-bit version of the QCam driver DLL.
 * @author rnagel
 */
public interface QCamDriverX64 extends Library {

    // Make the library name publicly accessible:
    public static final String DLL_NAME = "QCamDriverx64";

    // Load an instance of the library using JNA:
    public static final QCamDriverX64 INSTANCE = (QCamDriverX64) Native.loadLibrary(DLL_NAME, QCamDriverX64.class);

    // Load the QCam driver:
    int QCam_LoadDriver();

    // Obtain QCam driver version # (in major and minor increments)
    int QCam_Version (IntByReference major, IntByReference minor);
}

Я использую NetBeans 8.2 и JDK 1.8.0_121.

Спасибо, что заглянули! Буду признателен за любое понимание!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
116
1

Ответы 1

Вы можете легко воспроизвести это, позвонив

System.out.close();
System.err.close();

Я предполагаю, что собственный код в DLL что-то делает в этом отношении. Это может быть удобно, если выполнить вышеуказанный вызов. В этом случае вы можете сохранить System.out и System.err в переменных, установить некоторые фиктивные потоки с System.setOut() и System.setErr() и вернуть все, как было раньше, после вызова DLL. Если собственный код закрывает базовые дескрипторы файлов, это не поможет, и единственный вариант - отправить отчет об ошибке поставщику DLL.

Спасибо, проверю и кое-что попробую. Я должен был упомянуть, что System.err кажется незатронутым; только System.out останавливает печать.

Raymond Nagel 09.03.2018 19:45

Хорошо, я попытался поменять фиктивный поток вместо оригинала; но это по-прежнему повлияло на исходный поток System.out. На этот раз я также использовал OutputStream.checkError () и увидел, что он был ложным до и после вызова DLL, но истинным после следующей неудачной попытки println ().

Raymond Nagel 09.03.2018 20:07

В Linux попробуйте использовать strace, чтобы узнать, что делает DLL. В Windows см. Монитор API и ограничьте вызовы QCam DLL. Посмотрите, закрывает ли он поток.

cbr 10.03.2018 16:02

@cubrr Что такое «Монитор API»? Это программа, которую я могу откуда-то скачать? Спасибо.

Raymond Nagel 13.03.2018 19:06

@RaymondNagel Да, это загружаемый файл. Хотя разве в SDK нет документации? Возможно, QCam API.pdf по моему гугл-фу? Что там говорится о функции, которую вы вызываете?

cbr 13.03.2018 19:15

@cubrr В PDF-файле говорится: «Первый вызов, который вы должны сделать, - это QCam_LoadDriver (). Это инициализирует QCam и подготавливает его для связи с камерой». Он ничего не говорит о потоке. Также рекомендуется использовать язык C или C++; в нем говорится, что Java также можно использовать, но для этого потребуется написать небольшой слой-оболочку для вызова QCam API. На самом деле я написал такой слой в VB.Net много лет назад для этого API; но не было такой проблемы с затронутым выходным потоком. Я только что загрузил API Monitor, поэтому проверю. Спасибо.

Raymond Nagel 13.03.2018 19:40

Другие вопросы по теме