Нечетный вопрос здесь не совсем уверен, как его задать.
Я пишу некоторые привязки JNA для проприетарной разделяемой библиотеки.
API библиотеки имеет несколько функций, называемых такими вещами, как km_open, km_closeи т. д. В c эти функции определены в заголовочном файле следующим образом:
Komodo km_open (
int port_number
);
int km_close (
Komodo komodo
);
, а в Java я сделал для них привязки JNA, определенные так:
public abstract Komodo km_open(int port_number);
public abstract int km_close(Komodo komodo);
, но JNAне может найти эти символы в библиотеке.Когда я сбрасываю символы в двоичном файле, я нахожу следующее:
0000000000008e20 g DF .text 0000000000000005 Base net_km_open
0000000000007410 g DF .text 0000000000000005 Base c_km_open
0000000000008e40 g DF .text 0000000000000005 Base net_km_close
0000000000007430 g DF .text 0000000000000005 Base c_km_close
Я предполагаю, что, поскольку эта библиотека предназначена для использования как .net, так и автономными приложениями c, эти имена искажены, чтобы обеспечить альтернативуверсии функции.и все же я не могу найти ничего в исходном коде демонстрационного приложения, которое сопоставляет имя c_km_open с km_open.все же он компилируется в GCC и код работает.Как эти символы разрешаются при связывании / загрузке двоичного файла, и есть ли у JNA метод сделать то же самое?В настоящее время я могу заставить работать привязки JNA, если я изменю привязки следующим образом:
public abstract Komodo c_km_open(int port_number);
public abstract int c_km_close(Komodo komodo);
, что является приемлемым обходным путем. Я просто хочу понять, что происходит здесь в фоновом режиме.