Почему JNA не отображает char ** в String []? - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь связать Java-программу с DLL, используя JNA.

В моей C ++ DLL у меня есть функция, которая принимает char**. JNA API подразумевает, что должно быть сопоставлено с String[] в Java.

Так что, насколько я знаю, Foo(..., char** bar, ...) должно стать native Foo(..., String[] bar, ...).Однако, когда я пытаюсь запустить программу, я получаю исключение.

java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: class [Ljava.lang.String; is not a supported argument type (in method Foo in class DLL)
    at com.sun.jna.Native.register(Native.java:1604)
    at com.sun.jna.Native.register(Native.java:1529)
    at com.sun.jna.Native.register(Native.java:1252)
    at DLL.<clinit>(TrajParser.java:28)

Если я изменяю подпись на стороне java на byte[] или PointerByReference, то действительно кажетсяразрешить запуск программы, но я не уверен, как конвертировать String[] в любой из этих типов.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Оказывается, вместо использования String[] вы можете вместо этого создать com.sun.jna.StringArray

, чтобы оно стало native Foo(..., StringArray bar, ...), и для вызова функции, которую вы просто оберните String[]:

String[] array = new String[n];

DLL.Foo(..., new StringArray(array), ...);
0 голосов
/ 25 сентября 2018

Основная причина в том, что JNI / JNA использует примитивные типы.Экземпляр String - это Объекты, не являющиеся примитивными (даже если класс находится в пакете java.lang), поэтому имейте представление в памяти Java, которое не совместимо с C-кодом.Для информации, представление этого объекта хранит своего рода структуру с: ссылкой на класс (String), ссылкой на представление внутреннего массива, затем массив имеет свое собственное представление в памяти.

Ваш вариантдля преобразования строк из / в байты, вам нужно использовать кодировку:

для отправки строки

"My string".getBytes(StandardCharsets.UTF_8)

для получения

new String(bytes,StandardCharsets.UTF_8)
...