powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как бы в JNA включить автоматический Name demangile?
11 сообщений из 11, страница 1 из 1
как бы в JNA включить автоматический Name demangile?
    #37665306
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю DLL либу при помощи mingw. g++, который туда входит, void hellow() превращает в _Z6hellowv(), и именно по "кривому" имени функция доступна через JNA. Это неудобно. вот как бы так сделать, чтобы JNA автоматом понимал и прямое имя? И при этом не потерять кросс-платформенность?

Гугл советует сишные функции оборачивать extern "C", я пробовал - работает, но этот костыль, к сожалению, не работает с классами.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37665421
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokГугл советует сишные функции оборачивать extern "C", я пробовал - работает, но этот костыль, к сожалению, не работает с классами.Работайте с классами внутри функции-обёртки и уже её объявляйте как extern "C".
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37665463
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да, видимо прийдется.

просто в сях есть либа, которая умеет переводить имена туда-сюда. Думается, что в jna мог бы быть костыль, который бы прозрачно обратился к этой либе и нашел по манглутому имени деманглутое и уже его связал бы с жавовским.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37665567
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokДумается, что в jna мог бы быть костыль, который бы прозрачно обратился к этой либе и нашел по манглутому имени деманглутое и уже его связал бы с жавовским.И давно придумали стандарт на искажение имён?
И все компиляторы ему следуют?
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37666106
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Искажение имен компиляторо-зависимое, но оно само, как явление, насколько понимаю, придумано еще со времен царя гороха.

но - есть либа, которые умеют переводить имена туда-сюда. Используя эту либу, а так же знания о том, что количество стандартов манглинга исчисляется единицами, можно было бы упростить жизнь, выполняя на уровне jna поиск имен простым перебором разных вариантов манглинга.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37667464
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokно - есть либа, которые умеют переводить имена туда-сюда.Я повторю вопрос: "Для произвольного компилятора?"
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37670662
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

либы - сишные, для произвольного компилятора.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37670872
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokдля произвольного компилятора. Да-а-а :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
How different compilers mangle the same functions

There isn't a standard scheme by which even trivial C++ identifiers are mangled, and consequently different compiler vendors (or even different versions of the same compiler, or the same compiler on different platforms) mangle public symbols in radically different (and thus totally incompatible) ways. Consider how different C++ compilers mangle the same functions:
Compiler 	void h(int) 	void h(int, char) 	void h(void)
Intel C++ 8.0 for Linux 	_Z1hi 	_Z1hic 	_Z1hv
HP aC++ A.05.55 IA-64 	_Z1hi 	_Z1hic 	_Z1hv
IAR EWARM C++ 5.4 ARM 	_Z1hi 	_Z1hic 	_Z1hv
GCC 3.x and 4.x 	_Z1hi 	_Z1hic 	_Z1hv
GCC 2.9x 	h__Fi 	h__Fic 	h__Fv
HP aC++ A.03.45 PA-RISC 	h__Fi 	h__Fic 	h__Fv
Microsoft Visual C++ v6-v10 (mangling details) 	?h@@YAXH@Z 	?h@@YAXHD@Z 	?h@@YAXXZ
Digital Mars C++ 	?h@@YAXH@Z 	?h@@YAXHD@Z 	?h@@YAXXZ
Borland C++ v3.1 	@h$qi 	@h$qizc 	@h$qv
OpenVMS C++ V6.5 (ARM mode) 	H__XI 	H__XIC 	H__XV
OpenVMS C++ V6.5 (ANSI mode) 	CXX$__7H__FI0ARG51T 	CXX$__7H__FIC26CDH77 	CXX$__7H__FV2CB06E8
OpenVMS C++ X7.1 IA-64 	CXX$_Z1HI2DSQ26A 	CXX$_Z1HIC2NP3LI4 	CXX$_Z1HV0BCA19V
SunPro CC 	__1cBh6Fi_v_ 	__1cBh6Fic_v_ 	__1cBh6F_v_
Tru64 C++ V6.5 (ARM mode) 	h__Xi 	h__Xic 	h__Xv
Tru64 C++ V6.5 (ANSI mode) 	__7h__Fi 	__7h__Fic 	__7h__Fv
Watcom C++ 10.6 	W?h$n(i)v 	W?h$n(ia)v 	W?h$n()v

Notes:

    The Compaq C++ compiler on OpenVMS VAX and Alpha (but not IA-64) and Tru64 has two name mangling schemes. The original, pre-standard scheme is known as ARM model, and is based on the name mangling described in the C++ Annotated Reference Manual (ARM). With the advent of new features in standard C++, particularly templates, the ARM scheme became more and more unsuitable — it could not encode certain function types, or produced identical mangled names for different functions. It was therefore replaced by the newer "ANSI" model, which supported all ANSI template features, but was not backwards compatible.
    On IA-64, a standard ABI exists (see external links), which defines (among other things) a standard name-mangling scheme, and which is used by all the IA-64 compilers. GNU GCC 3.x, in addition, has adopted the name mangling scheme defined in this standard for use on other, non-Intel platforms.
    The Visual Studio and Windows SDK include the program undname which prints the C-style function prototype for a given mangled name.
    On Microsoft Windows the Intel compiler uses the Visual C++ name mangling for compatibility.[1]

?
On Microsoft Windows the Intel compiler uses the Visual C++ name mangling for compatibility.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37670930
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, в либе эти правила зашиты, поэтому она может деманглить любые имена.

И вообще.
Я нашел такую штуку как BridJ. Там можно вызывать классы напрямую, без этого манглинга, а это уже свидетельствует о том, что в с++ можно манглинг как-то отключить. Правда, у меня пока с этой либой не заработало: С-функции вызывать получается, а классы нет.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37671441
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,
Я не проф в си. Но насколько я понял, сишный компилятор не преобразует имена функций. Поэтому и не дает скомпилить две функции с одним именем и возвращаемым значением но с разным по типу параметром (как описано по ссылке, которую дал Basil A. Sidorov ) :
Код: plaintext
1.
2.
int  f (void) { return 1; }
int  f (int)  { return 0; }



Компилятор с++ даст скомпилить, потому что он преобразует имена функций на основании возвращаемого значения, списка параметров.

Поэтому-то Вы и можете вызвать сишные функции по "чистому" имени, и, думаю, без BridJ.
...
Рейтинг: 0 / 0
как бы в JNA включить автоматический Name demangile?
    #37671506
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аа, точно-точно.

Но в том-то и дело, что BridJ каким-то образом, если верить документации и примерам, позволяет оперировать классами. Я уверен, что оно работает, но заставить ее работать с классом у меня ее пока не вышло. Судя по документации, там есть некоторая нативная прослойка, которая эти имена резолвит.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / как бы в JNA включить автоматический Name demangile?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]