Здравствуйте, мои дорогие и жуйковчане,

Сегодня мы с вами поговорим о способах декларации JNI-методов в сишном коде:

Метод первый: «на отъебись», т.е. без указания сигнатуры метода:

JNIEXPORT void JNICALL Java_com_example_pkg_ClassName_methodName(JNIEnv* env, jobject this, jint int_value, jdouble double_value)

Просто и понятно, но нихуя не type safe. Т.е. в сишном коде функцию можешь
объявить на два параметра, а потом всё забыть и в жаба-коде её сделать
принимающей один параметр, и будет у тебя во втором параметре мусор.

Метод второй: «для задротов», т.е. ебошим хардкор и имя функции манглим:

JNIEXPORT void JNICALL Java_com_example_pkg_ClassName_methodName__ID(JNIEnv* env, jobject this, jint int_value, jdouble double_value)

В этом случае, при попытке вызвать функцию не с тем количеством или качеством
аргументов, вы получите java.lang.UnsatisfiedLinkError и ошибку можно будет
легко обнаружить.

Кто-то может задаться вопросом, что предпочтительнее с точки зрения
производительности. В icedtea сначала происходит попытка зарезолвить символ без
сигнатуры, а потом уже символ с сигнатурой. Так что такие символы будут быстрее
загружаться. Вот только если вы экономите каждый dlsym, то возможно вам стоит
попробовать себя в программировании на llvm language