Сохранение ссылки на объект C с помощью JNI (и USB-программирования)

#java #c #java-native-interface #usb

#java #c #java-native-interface #usb

Вопрос:

У меня есть записывающее устройство USB с API, написанным на C . Я хотел бы связать его с существующим приложением Java, где при инициализации приложения оно подключается к устройству, а затем может впоследствии запускать и останавливать запись, вместо того, чтобы повторно подключаться для каждой записи. Для этого потребуется ссылка на соединение на стороне Java. Можно ли обернуть код C в класс и сохранить ссылку на его объект в конце Java, чтобы при необходимости вызвать метод записи start / stop?

В противном случае API не добавляет столько дополнительных функций, поскольку байтовые команды для отправки на устройство для запуска и остановки записи довольно просты. Было бы проще напрямую взаимодействовать с USB? У меня мало опыта работы с JNI и нет опыта программирования через USB.

К сожалению, я не могу поделиться каким-либо примером кода из этого проекта.

Комментарии:

1. Создайте unique_ptr объект C в куче. Есть функция JNI C , которая возвращает a jlong и возвращает в теле: unique_ptr.get() . Пусть соответствующая функция Java JNI возвращает a long . Без unique_ptr and one static object вы могли бы выделить в куче, используя new , а затем уничтожить, используя delete из потока завершения работы java. ИЛИ vector unique_ptr для каждого экземпляра объекта.

2. То, что вам нужно, — это, вероятно, шаблон однорангового объекта. Гораздо безопаснее (и более переносимо), чем приводить указатели в jlong s, передавать дескриптор в Java-land и поддерживать std::map<handle, std::unique_ptr<T>> на стороне C . Это дает вам возможность проверить, действительно ли объект существует при вызовах. В конце концов, вам нужно что-то, чтобы владеть std::unique_ptr — поскольку вы не получите ни одного из умных умных указателей c 11, когда вы reinterpret_cast используете их для целых типов.