Как правильно использовать RegisterNatives - PullRequest
2 голосов
/ 23 сентября 2011

Я пытаюсь зарегистрировать нативную функцию через jni, и для этого мне нужно сохранить указатель на функцию в структуре jninativemethod, которая имеет поле void * для указателя функции.

При установке этого поля я получаю ошибку error: invalid conversion from void (*)(JNIEnv*, _jclass*, jlong, _jobject*)' to void* при компиляции с GCC в Unix.

Я посмотрел вокруг, и кажется, что вам не разрешено преобразовывать указатели функций в указатели void, такэтот интерфейс просто сломан?Есть ли «правильный» способ сделать это?(кроме использования javah для генерации заголовков и экспорта функций)

1 Ответ

4 голосов
/ 27 сентября 2011

Это правда, что приведение указателя функции к void* не одобряется в C ++, потому что стандарт объявляет его неопределенным поведением.

Однако в случае чего-то вроде RegisterNatives, естьна самом деле нет альтернативы.К счастью, компиляторы, которые вы, вероятно, будете использовать с JNI, достаточно хороши, чтобы заставить приведение вести себя так, как вы ожидаете, несмотря на протесты стандарта.

Для чего стоит, документация Visual C ++ для void явно упоминает, что «пустой указатель может указывать на функцию», так что вы в хорошей форме по этому вопросу.Кроме того, функция POSIX dlsym также требует, чтобы приведение типа «пустое к функции» было законным, поэтому маловероятно, что GCC вас здесь запутает.

Вы также можете проверить следующеедва ответа для получения дополнительной информации о законности и эффективности приведения между указателями void и указателями функций:

...