Показать сообщение отдельно
Старый 16.08.2017, 01:50   #1
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 978
Написано 388 полезных сообщений
(для 631 пользователей)
Вызов нативного кода через JNI

Несколько дней назад решил 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 не влияет на результат, даже если сделать пустой класс. Короче как-то однозначно воспроизвести баг и понять причины не удаётся. Саму С++ либу я много раз линковал к другим проектам с нативным кодом - она работает без ошибок, к тому же я специально создал тестовую пустую либу где есть только функция и один объект (как в приведённом коде) - результат тот же.
(Offline)
 
Ответить с цитированием