#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 , которая возвращает ajlong
и возвращает в теле:unique_ptr.get()
. Пусть соответствующая функция Java JNI возвращает along
. Безunique_ptr
andone 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
используете их для целых типов.