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




Вы можете легко воспроизвести это, позвонив
System.out.close();
System.err.close();
Я предполагаю, что собственный код в DLL что-то делает в этом отношении. Это может быть удобно, если выполнить вышеуказанный вызов. В этом случае вы можете сохранить System.out и System.err в переменных, установить некоторые фиктивные потоки с System.setOut() и System.setErr() и вернуть все, как было раньше, после вызова DLL. Если собственный код закрывает базовые дескрипторы файлов, это не поможет, и единственный вариант - отправить отчет об ошибке поставщику DLL.
Хорошо, я попытался поменять фиктивный поток вместо оригинала; но это по-прежнему повлияло на исходный поток System.out. На этот раз я также использовал OutputStream.checkError () и увидел, что он был ложным до и после вызова DLL, но истинным после следующей неудачной попытки println ().
В Linux попробуйте использовать strace, чтобы узнать, что делает DLL. В Windows см. Монитор API и ограничьте вызовы QCam DLL. Посмотрите, закрывает ли он поток.
@cubrr Что такое «Монитор API»? Это программа, которую я могу откуда-то скачать? Спасибо.
@RaymondNagel Да, это загружаемый файл. Хотя разве в SDK нет документации? Возможно, QCam API.pdf по моему гугл-фу? Что там говорится о функции, которую вы вызываете?
@cubrr В PDF-файле говорится: «Первый вызов, который вы должны сделать, - это QCam_LoadDriver (). Это инициализирует QCam и подготавливает его для связи с камерой». Он ничего не говорит о потоке. Также рекомендуется использовать язык C или C++; в нем говорится, что Java также можно использовать, но для этого потребуется написать небольшой слой-оболочку для вызова QCam API. На самом деле я написал такой слой в VB.Net много лет назад для этого API; но не было такой проблемы с затронутым выходным потоком. Я только что загрузил API Monitor, поэтому проверю. Спасибо.
Спасибо, проверю и кое-что попробую. Я должен был упомянуть, что System.err кажется незатронутым; только System.out останавливает печать.