Глобальные статические переменные JNI в коде C ++ - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть код JNI C ++, вызываемый из многопоточного Java-приложения

Этот код C ++ имеет 2 глобальные статические переменные - логическое значение и строку.

По какой-то причине я продолжаю получать ошибку сегментации из этого кода.Есть идеи, что может привести к этому?Я знаю, что это не потокобезопасно, но я рассматриваю переменные как только для чтения из Java-приложения, и только код C ++ способен изменять значения этих переменных

Помогите высоко ценится

РЕДАКТИРОВАТЬ: Этот код работает на машине Linux.И работает в течение нескольких месяцев без каких-либо проблем, затем выдает ошибку сегментации сигнала 11, и JVM падает.

1 Ответ

5 голосов
/ 22 декабря 2010

Если вы вызываете код C ++ из нескольких потоков, а код C ++ имеет глобальные статические переменные, было бы замечательно, если бы он работал.Самое простое, что можно попробовать - это поставить блокировку вокруг вызова, то есть на стороне Java изменить

native int callToCppFunction(int parameter);

на

synchronized native int callToCppFunction(int parameter);

, чтобы в C ++ мог быть только один потоккод за раз.

Тогда есть еще одна возможная проблема, с которой я столкнулся около года назад: по-видимому, в Windows dll ее может быть недостаточно для сериализации обращений к ней (т.е. использовать synchronized).Они также могут требовать, чтобы каждый раз из одного и того же потока вызывался . Этот ответ предлагает объяснение того, как это может быть.Решение состоит в том, чтобы сделать однопотокового исполнителя на стороне Java и направить через него все вызовы в нативный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...