Передать параметр pchar функции Delphi dll из java JNA

У меня есть файл .dll. Файл Dll, разработанный на языке Delphi. Есть метод getKeyPadStatus. В этом методе четыре параметра. Вот функция:

function GetKeyPadStatus(var addr:byte; var pstatus,pnumber:pchar;var ptocounter:byte):boolean;stdcall;

Теперь я хочу вызвать эту функцию из java, используя JNA. Вот мой код Java:

public class TestKeyPad {

static boolean flag = false;
public interface NativeExample extends Library {

    public boolean initPort(byte port);
    public boolean ScanKeyPad(byte addr, int waithum);
    public boolean getKeyPadStatus(byte addr, String pstatus, String pnumber, byte ptocounter);

}

public static void main(String[] args) {
    NativeExample nativeExample = (NativeExample) Native.loadLibrary("KeyPad", NativeExample.class);

    flag = nativeExample.initPort((byte)1);
    System.out.println("Init value : " + flag);

    flag = nativeExample.ScanKeyPad((byte)5, 2);
    System.out.println("Scan value : " + flag);

    flag = nativeExample.getKeyPadStatus((byte)5,  "L",  "0", (byte)5);
    System.out.println("pstatus value : " + flag);
}
}

Но я получаю сообщение об ошибке. Ошибка, которую я нашел:

Init value : true
Scan value : true
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking   up function 'getKeyPadStatus': The specified procedure could not be found.

at com.sun.jna.Function.<init>(Function.java:245)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:566)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:542)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:528)
at com.sun.jna.Library$Handler.invoke(Library.java:228)
at com.sun.proxy.$Proxy0.getKeyPadStatus(Unknown Source)
at call_dll.TestKeyPad.main(TestKeyPad.java:38)

Итак, как я могу отправить значение pchar из java в функцию delphi? Будет здорово, если я получу это решение.

Мало информации. Параметры var потенциально являются входными/выходными. Вам необходимо ознакомиться с документацией или примером кода, который вызывает функцию.

David Heffernan 07.04.2019 14:42

А также, с какой версией Delphi была написана DLL? Это важно, чтобы знать, соответствует ли PCharPAnsiChar или PWideChar, что повлияет на то, как код Java должен маршалировать строковые данные в/из DLL.

Remy Lebeau 07.04.2019 18:44

ISTM, что Java просто не может найти «GetKeyPadStatus», потому что ищет «getKeyPadStatus». Могут быть и другие проблемы, но это, кажется, первая проблема.

Rudy Velthuis 08.04.2019 08:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
193
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Имя моего метода было неправильным. Это будет «GetKeyPadstatus».

Другие вопросы по теме