У меня не было никаких последствий, кроме повышения производительности.
Это именно то, что я делаю в приложении, которое перетасовывает данные ByteBuffer
с прямым распределением между двумя уровнями.Я обнаружил, что стоимость постоянного присоединения / отсоединения была очень высокой, как и следовало ожидать.Мой подход заключается в запуске одного управляемого Java-потока, который при запуске выполняет блокирующий вызов JNI, который на уровне C / C ++ содержит цикл условие / стиль сигнала (чтобы не потреблять циклы ЦП).Затем я могу сигнализировать о цикле в любое время, когда данные готовы к обработке, и, наоборот, я могу сигнализировать до Java, когда тяжелая работа завершена.
new Thread(() -> myBlockingJNICall()).start();
Затем вниз на уровне C:
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
static JavaVM *jvm = nullptr; // captures the JVM on load
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *the_jvm, void* /*reserved*/)
{
jvm = the_jvm;
return JNI_VERSION_1_2; // must export 1_2 to use any of the new functions, 1_1 otherwise
}
JNIEXPORT jboolean JNICALL Java_myBlockingJNICall(JNIEnv *env, jobject)
{
// loop forever waiting for work and using env for signalling
// jvm is stored in case we need to manually attach (or perform more complex work requiring jvm access)
return JNI_TRUE;
}
#ifdef __cplusplus
}
#endif // __cplusplus