В документации Android вы можете найти следующий совет:
Собственный код не обязательно более эффективен, чем Java. Для одной вещи,
есть стоимость, связанная с нативным переходом Java, и JIT
не может оптимизировать через эти границы. Если вы выделяете родной
ресурсы (память в собственной куче, файловые дескрипторы или что-то еще),
может быть значительно сложнее организовать своевременный сбор
эти ресурсы. Вы также должны скомпилировать свой код для каждого
архитектура, на которой вы хотите работать (вместо того, чтобы полагаться на нее с JIT).
Возможно, вам даже придется собрать несколько версий для того, что вы считаете
та же архитектура: нативный код, скомпилированный для процессора ARM в
G1 не может в полной мере использовать ARM в Nexus One, и код
скомпилированный для ARM в Nexus One не будет работать на ARM в G1.
Грубо говоря, код Dalvik медленнее, чем чистый C / C ++, оптимизированный для платформы. Но связь между собственным кодом и кодом Java происходит через JNI, который является основным источником накладных расходов.
Так что ответ на ваш вопрос - да, JNI вводит дополнительные накладные расходы. Но если вы хотите портировать существующий код C / C ++, ndk - лучший выбор в вашем случае.