2015-01-13 1 views
0

Я разрабатываю приложение на Java, которое должно связываться с микропроцессором msp430 от TI. Для связи с устройством я использую java-код hidDemo и предоставленную DLL (которая использует скрытый код API C).java hid communication dll делает jvm crash

Моя проблема в том, что я получаю ошибки на уровне DLL, которые разбивают JVM. Проблемы возникают, когда я общаюсь с устройством, и когда я отсоединяю устройство.

Я пытался обработать ошибку на уровне DLL без успеха. Я также попытался перекомпилировать DLL с новой версией API с скрытым доступом; до сих пор не повезло.

След ошибки генерируется JRE следующая:

Инструкции: (рс = 0x74672874) 0x74672864: Произошла
[ошибка при передаче сообщений об ошибках (регистры печати, верхней части стека, инструкции возле ПК), идентификатор 0xc0000005]

Стек: [0x4f7c0000,0x4f9c0000], зр = 0x4f9bf1c0, свободное пространство = 2044k Native кадров: (J = составлен Java-код, J = интерпретированы, Vv = ВМ код, С = машинный код) C 0x74672874 C [hidcommunicationman ager.dll + 0x11db3] С [hidcommunicationmanager.dll + 0x13844] J com.ti.msp430.usb.hiddemo.management.HidCommunicationManager.getSerialsForVidPid (II), [Ljava/языки/Строка; +0

Ошибка - это EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x74672874, pid=3336, tid=5444, которая похожа на исключение NullPointer.

Любые советы о том, как это решить?

+0

Попросите поставщика исправить DLL, чтобы он этого не делал. Невозможно защитить себя от неисправной DLL на Java. –

+0

Вещь - я могу перекомпилировать DLL, они предоставляют демонстрационный проект для диалога с микропроцессором. Я уже спросил поставщика о сбое;) – Romain

+0

Возможно, DLL может повредить память так, чтобы это не вызывало проблемы в DLL, но вызывает проблему в остальной части программы. Возможно также, что вы продолжаете использовать ресурс, который больше не доступен после того, как DLL очистит его. –

ответ

1

Java не позволяет улавливать ошибки памяти, созданные в DLL.

Что вы можете сделать, это запустить другой процесс для запуска DLL. Это может быть полезно, если вы говорите, что у вас есть 32-разрядная DLL и 64-разрядная JVM или третья партийная библиотека, которой вы не доверяете (JAR или DLL)

Вы можете связываться с JVM, которую вы запускаете через каналы, сокеты или разделяемую память. Если процесс умирает, ваша основная программа продолжает работать и может перезапустить процесс.

+0

Это может быть решением, спасибо за эту идею. Я все еще готов прочитать некоторые мысли об ошибке – Romain

+0

Я попытался переключиться на java hid api ... он работает под Windows 7, но api не работает в Windows 8/8.1/8.1 SP1. – Romain

+0

@Romain Что вы подразумеваете под «не работает»? –