При связывании С++ и Java с использованием JNI мы всегда хотим избежать ненужного копирования. Я обнаружил, что GetPrimitiveArrayCritical
может дать нам высокую вероятность не копировать массив. Но я не полностью понимаю его ограничение, зарегистрированное здесь:
После вызова GetPrimitiveArrayCritical, внутренний код не должен запускаться в течение длительного периода времени, прежде чем он вызовет ReleasePrimitiveArrayCritical. Мы должны рассматривать код внутри этой пары функций как выполняющийся в "критической области". Внутри критической области собственный код не должен вызывать другие функции JNI или любой системный вызов, который может заставить текущий поток блокировать и ждать другой поток Java. (Например, текущий поток не должен вызывать чтение в потоке, написанном другим потоком Java.)
Эти ограничения делают более вероятным, что собственный код получит неопубликованную версию массива, даже если виртуальная машина не поддерживает пиннинг.
Мои вопросы:
-
Каков точный смысл расширенного периода времени?
-
Значит ли это, что мы можем безопасно вызвать другие функции JNI или системный вызов, которые никогда не заставят текущий поток блокировать и ждать другой поток Java?
-
Является GetPrimitiveArrayCritical потокобезопасным?
-
Есть ли что-нибудь, что я должен знать при использовании GetPrimitiveArrayCritical вместо GetArrayRegion?