У меня есть приложение Java, которое использует C ++ DLL через JNI. Несколько методов DLL принимают строковые аргументы, а некоторые возвращают объекты, которые также содержат строки.
В настоящее время DLL не поддерживает Unicode, поэтому обработка строк довольно проста:
- Java вызывает String.getBytes () и передает полученный массив в DLL, которая просто обрабатывает данные как символ *.
- DLL использует NewStringUTF () для создания jstring из const char *.
Сейчас я нахожусь в процессе изменения DLL для поддержки Unicode, переключаясь на использование типа TCHAR (который при определении UNICODE использует тип данных WCHAR в Windows). Модификация DLL идет хорошо, но я не уверен, как изменить часть кода JNI.
Единственное, о чем я могу думать сейчас, это:
- Java вызывает String.getBytes (String charsetName) и передает полученный массив в DLL, которая обрабатывает данные как wchar_t *.
- DLL больше не создает Strings, а вместо этого передает jbyteArrays с необработанными строковыми данными. Java использует конструктор String (byte [] bytes, String charsetName) для фактического создания String.
Единственная проблема этого метода в том, что я не уверен, какое имя кодировки использовать. WCHAR длиной 2 байта, так что я уверен, что это UTF-16, но на стороне java есть 3 возможности. UTF-16, UTF-16BE и UTF-16LE. Я не нашел никакой документации, в которой говорилось бы, каков порядок байтов, но я, вероятно, смогу выяснить это после некоторого быстрого тестирования.
Есть ли лучший способ? Если возможно, я бы хотел продолжить создание объектов jstring в DLL, так как таким образом мне не придется изменять использование этих методов. Однако метод JNI NewString не принимает идентификатор кодировки.