Прямой вызов JNA не работает с аргументом Structure [] - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть функция C ++:

struct Result {
    //...
};
bool doSomething(Result[]);

Если я использую следующую привязку JNA, вызов функции работает нормально:

public class Result extends Structure {
    //...
}

public interface CPPLibrary extends Library {
    public static final CPPLibrary INSTANCE = (CPPLibrary)Native.loadLibrary("dllname");
    boolean doSomething(Result[]);
}

Но при прямом вызове я попал в IllegalArgumentException , говоря class [Lcom.usta.Result; не поддерживается тип аргумента (в методе calcPV01 в классе com.usta.CPPLibrary) . Мой код JNA для прямого сопоставления вызовов:

public class CPPLibrary implements Library {
    Native.register("dllname");
    public static native boolean doSomething(Result[]);
}

Я вижу в com.sun.jna. Функция # convertArgument () явно обрабатывает Структура [] , но com.sun.jna.Native # getConversion () , который используется прямым сопоставлением вызовов, не обрабатывает Структура [] .

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Преобразование тривиально, просто вызовите Structure.getPointer () для первого элемента вашего массива структуры (в первую очередь, если вы получили массив из Structure.toArray).

Вы на самом делелучше при использовании прямого картирования;при передаче не примитивных типов без указателей слой JNI должен вызывать обратно в ВМ для получения соответствующих собственных данных.

Не стесняйтесь подавать проблему для поддержки аргументов Structure [] в прямых сопоставлениях.Это должно поддерживаться (документация JNA отмечает, что массивы Pointer / String / WString / NativeMapped не поддерживаются).

0 голосов
/ 09 декабря 2011

Если я использую сигнатуру другого метода:

boolean doSomething(Pointer results);

, она работает.Но затем я должен конвертировать из Result [] в Pointer свое «я».

...