C++ и Java: совместное использование - Правила формирования имени С/С++-функции
ОГЛАВЛЕНИЕ
Правила формирования имени С/С++-функции
Имя С/С++-функции формируется путем последовательного соединения следующих компонентов:
- префикс JAVA_;
- полное квалифицированное имя класса;
- символ подчеркивания ("_");
- имя метода;
- для перегружаемых (OVERLOADED) методов - два символа подчеркивания ("_ _") с последующей сигнатурой метода.
Использование имен с сигнатурой на конце необходимо только в случае перегрузки двух или более собственных методов (перегрузка с обычным методом не важна, так как обычные методы не будут находиться в создаваемой библиотеке, что, однако, не допускает наличия собственного и обычного метода с одинаковыми именами и сигнатурами).
Для соответствия лексиграфическим правилам С/С++ и использования UNICODE-кодировки, применяются дополнительные правила преобразования, представленные в табл. 2.
Таблица 2
Исходный символ | Результирующая последовательность |
"_" | _1 |
";" | _2 |
"[" | _3 |
символ UNICODE с кодом ХХХХ | _0ХХХХ |
Ниже приведен пример JAVA-класса с собственными методами:
PACKAGE TESTPACKAGE;
ABSTRACT CLASS TEST {
PUBLIC NATIVE VOID M1(STRING[] SA, OBJECT O, INT[][] IA2);
PUBLIC NATIVE FLOAT[] M1(DOUBLE D, TEST T);
PUBLIC NATIVE TEST M3(INT I);
}
и соответствующие им имена С/С++-функций:
JNIEXPORT VOID JNICALL JAVA_TESTPACKAGE_TEST_M1___3LJAVA_LANG_STRING_2LJAVA_LANG_OBJECT_2_3_3I
(JNIENV *, JOBJECT, JOBJECTARRAY, JOBJECT, JOBJECTARRAY);
JNIEXPORT JFLOATARRAY JNICALL JAVA_TESTPACKAGE_TEST_M1__LJAVA_LANG_DOUBLE_2LTESTPACKAGE_TEST_2
(JNIENV *, JOBJECT, JOBJECT, JOBJECT);
JNIEXPORT JOBJECT JNICALL JAVA_TESTPACKAGE_TEST_M3
(JNIENV *, JOBJECT, JINT);
Рассмотрим типы параметров, которые получает на входе С/С++-функция при ее вызове.