Я не знаю, какие JVMs реализации/не осуществлять прямые ByteBuffers. Но в некотором смысле это не особенно актуально ... потому что всегда возможно, что у какого-то поставщика появится новая JVM, которая меняет уравнение, поддерживая/не поддерживая прямые ByteBuffers.
Должна ли библиотека JNI всегда кодировать управляемые ByteBuffers и относить прямые ByteBuffers как оптимизацию?
Это зависит от ваших целей.
Если ваша цель - максимальная переносимость, то ваш код JNI не должен предполагать, что доступны прямые ByteBuffers.
Если ваша цель - максимальная производительность, тогда ваш код может предполагать, что прямые байтовые буферы всегда будут доступны (и сломаются, если это не так). Кроме того, у вас могут быть две разные библиотеки JNI (или условно скомпилированные варианты одной и той же библиотеки), которые Java-сторона выбирает между ними во время выполнения в зависимости от поддержки платформы для прямых ByteBuffers.
Но это все кажется немного отключенным от реальности. Спустившись по маршруту JNI, вы неявно принимаете путь непереносимости. Вам уже приходится иметь дело с родными библиотеками, которые (по крайней мере) должны быть перекомпилированы для разных JVM и разных целевых платформ. И я бы подумал, что тестирование на всех поддерживаемых платформах имеет важное значение.
Таким образом, не ожидайте значительных сокращений для многоплатформенной поддержки вашего кода JNI.