2015-04-16 2 views
0

У меня есть встроенная подпрограмма thirdparty в C, которая хочет выводить результаты в дескриптор файла. Я могу выбрать дескриптор файла (включая стандартный вывод, stdout, если захочу), передав его в подпрограмму C, но я не могу его выводить ни на что иное, кроме файлового дескриптора. Я создал свой собственный C-код, чтобы действовать как интерфейс между Java и этой подпрограммой C.Как получить выход из метода JNI (native), реализованного в C обратно к Java

Как я могу получить результат работы подпрограммы C непосредственно на Java ... то есть, не записывая ее в файл, а затем читая ее обратно?

Выходной файл обычно находится в районе 20-30k и является простым для чтения человеком текстом, поэтому он не очень большой и имеет смысл для моих пользователей. Я хотел бы отобразить вывод для пользователя в консоли Java, как окно, когда оно выводится. Это возможно? И как?

Я вижу, что Java имеет объект FileDescriptor ... это эта часть решения? Я не хочу подключать свой C fd к объекту FileDescriptor (используя личное поле FileDescriptor), как описано здесь: http://www.kfu.com/~nsayer/Java/jni-filedesc.html

Я хотел бы сделать это, используя лучшие практики и идиомы Java.

+2

Если данные представляют собой простой байт/массив символов, вы можете просто использовать jbyteArray/jcharArray в качестве типа возврата для функции JNI. – Paul

+0

Возможно, вы сможете печатать на stdout, если вы хотите, чтобы текст отображался в консоли java/shell что приложение было запущено. Я не тестировал это. – SamTebbs33

+0

Paul, собственный код записывает в дескриптор файла ... поэтому у меня нет массива символов или байтов для возврата. Но на основе вашего комментария я мог бы создать дескриптор файла, который хранит вывод в массиве байтов в моем коде C и возвращает это ... – Jason

ответ

1

Если вы используете Unix-подобную систему, подумайте о создании именованного канала, а затем откроете его как в родном, так и в Java-коде, как если бы это был обычный файл.

Это похоже на использование временного файла, за исключением того, что данные поступают непосредственно от записывающего устройства к считывателю без сохранения на диске.

Недостатком является то, что вам все равно придется управлять временным именованным каналом.

+0

Спасибо за предложение. Мне тоже нужно решение для работы в Windows. – Jason