После прочтения нескольких статей большинство из них показывают, как экспортировать код C в Android под JNI. Моя проблема в том, что у меня есть классы C++ с множеством перегруженных функций. Если я хочу экспортировать/обернуть их с помощью JNI - возможно ли это сделать, если я могу пропустить «extern» C, который, если я прав, используется, чтобы избежать манипулирования именами функций.Является ли «extern» C обязательным под Android - JNI?
ответ
Удаление указателя имени требуется в любое время, когда код C должен быть способен вызвать код C++ по символу. Если вы не уверены, что можно отключить это, вы можете легко узнать: если вы начинаете с кода, который компилируется, удалите extern "C"
вокруг интересующих вас частей. Если он все еще компилируется, вы в безопасности. Если вы небезопасны, вы получите неопределенные ссылочные ошибки из компоновщика.
Хорошо спасибо за ответ. Думаю, мне нужно усердно учиться! Удаление extern и тестирование! – Wajih
Правильная идея, но «компиляция» не является достаточным критерием. Плакат работает с jni-библиотеками, а именно динамической компоновкой, выполняемой по имени во время выполнения. Пока нет кода C (или подобного), статически вызывающего C++, неуправляемые искаженные имена будут строить и связывать в библиотеку просто отлично, но не выполняются во время выполнения, когда jni запрашивает динамический компоновщик, чтобы найти метод по его неповрежденному имени. –
@ChrisStratton да, это очень хороший момент. – mah
@mah Сделайте это ответом, я бы сказал, что любой другой тег, кроме [tag: c] и [tag: C++], совершенно не имеет отношения к вопросу! –
@ πάνταῥεῖ answerd; Благодарю. – mah
wikipedia, похоже, думает, что JNI не использует название mangling. Следовательно, extern «C» потребуется при смешивании JNI с C++. http://en.wikipedia.org/wiki/Java_Native_Interface – user3386109