#java #dll #windows-mobile #bluetooth #java-native-interface
#java #dll #windows-mobile #bluetooth #java-родной интерфейс
Вопрос:
У меня есть Java-приложение, которое запущено на устройстве Windows Mobile. Мне нужно иметь возможность включать и выключать Bluetooth, чтобы для этого выполнялся некоторый собственный код. Проблема в том, что я пробую это на новом устройстве (HTC HD2), и собственный код не работает. Причина этого в том, что устройство HD2 использует стек Widcomm Bluetooth, в то время как другое устройство использовало стек Microsoft.
Теперь я нашел способ активировать Bluetooth на устройстве HD2 с помощью Widcomm SDK. Однако этот собственный код должен быть способен запускаться на любом устройстве, поэтому каким-то образом мне нужно иметь возможность принимать решение во время выполнения, какой код запускать, на основе того, какой стек Bluetooth присутствует.
Вопрос 1: как я могу программно определить, какой стек присутствует?
Вопрос 2. если я включу файл заголовка, необходимый для стека Widcomm, и попытаюсь запустить его на устройстве, которое его не использует, произойдет сбой кода. Как я могу скомпилировать dll, чтобы она включала этот заголовочный файл только в том случае, если библиотека DLL Widcomm существует?
Ответ №1:
Я предполагаю, что вам может потребоваться сделать все это динамически:
- Объявите прототипы для необходимых функций Widcomm в своем собственном коде.
- Используйте
LoadLibrary
для загрузки библиотеки DLL Widcomm. - Если
LoadLibrary
вызов завершается неудачно, то вы знаете, что находитесь в стеке Microsoft, и можете запускать стандартные функции стека Microsoft. - В случае
LoadLibrary
успешного выполнения вы находитесь в стеке Widcomm и можете использовать функции Widcomm.
Это может быть немного запутанным в зависимости от того, сколько функций вам нужно из заголовка Widcomm, но вы не можете статически скомпилировать ссылки на эти функции, поскольку он попытается загрузить его и не найдет (вероятно, поэтому вы видите сбой).
Это действительно ужасно, что сумасшествие со стеком Bluetooth существует и в Windows Mobile. Думал, что это ограничено рабочим столом.
Комментарии:
1. Ну, в разных ОС я не настолько разбираюсь, но в рамках одного поставщика / платформы это просто смешно. Независимо от современной версии Linux, OSX остается той же, что и Android, как и iOS. Windows, похоже, является единственной ОС, в которой две установки одной и той же версии одной и той же ОС могут иметь разные интерфейсы к стеку Bluetooth.
2. Да. Интересно, кто принимает некоторые из этих решений — или как они принимают эти решения???
3. Они принимают решения? 🙂
4. 2Funny… Я думаю, они вывели свою ручную обезьянку, которая просто бросает экскременты в мишень для дартса … пресловутое «посмотрим, что застрянет».