@hirthwork

Тег jni в блоге hirthwork

hirthwork

Есть в JNI функция GestStringUTFChars
Так вот, спустя несколько лет использования выяснилось, что она возвращает не UTF-8, а “modified UTF-8” ...или сказка о том как Х-ворк багу при передаче емодзи искал

hirthwork

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

Сегодня мы с вами поговорим о способах декларации 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

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.