Несколько дней назад решил Java освоить.
Вот есть такой вопрос:
Вот есть либа с нативным кодом (С++), я хочу вызывать функции от туда. Сделал java класс с native методами и через javah получил хедер для С/С++ и реализовал его в коде. Функции вызываются нормально. Проблема появляется когда я добавил глобальную переменную в С++ код.
smd::sgz::err_c err; // Вот эту.
JNIEXPORT void JNICALL Java_sgz_SysgzrCalls_testOne( JNIEnv*, jclass ) {
cout << "Test One !!!" << endl;
}
Приложение начинает крошиться вместе с машиной. Машина говорит что виноват вызываемый код. Я запустил под gdb вместе с машиной и посмотрел backtrace - ошибка внутри libstdc++.so в аллокаторе std::string'а, которая линкуется к моему коду и по стеку выше видно что вызов происходит из конструктора err_c. Тем не менее ещё не значит что виноват мой код - возможно java как-то не так загружает либу? Самое интересное что если изменить имя на errEx например - приложение работает, а вот err и error крошатся. Изменение содержимого класса err_c не влияет на результат, даже если сделать пустой класс. Короче как-то однозначно воспроизвести баг и понять причины не удаётся. Саму С++ либу я много раз линковал к другим проектам с нативным кодом - она работает без ошибок, к тому же я специально создал тестовую пустую либу где есть только функция и один объект (как в приведённом коде) - результат тот же.