У меня есть класс Java, который вызывает класс C ++ через класс JNI C ++ для доступа к функциональности команды 'file', предоставляемой libmagic.so.
- Класс C ++ компилируется и нормально работает как main () C ++
- Отлично работает на RHEL 5 под управлением Java 1.5 и 1.6;
- отлично работает на RHEL 4 под управлением Java 1.5
- сбрасывает ошибку сегмента 26234 на RHEL 4 с Java 1.6
Ошибка сегмента:
Происходит при вызове char * retptr = magic_buffer (cookie, bigbuf, 1000);
Нет вины, когда
char * retptr = «хорошая безопасная строка символов»; замещен Вот почему я пришел к выводу, что ошибка seg возникает при этом вызове.
Я использую альтернативный вызов char * retptr = magic_file (cookie, ”/ usr / include / magic.h”); для устранения проблем с буфером, так как этот вызов возвращает то же сообщение о типе файла, для которого требуется только полный путь к файлу, а не буфер с полным содержимым файла. Это также вызывает ошибку seg на тестовой виртуальной машине RHEL4 / java 1.6. Таким образом, я прихожу к выводу, что в моем коде проблема заключается не в плохих указателях или переполнении буферов.
magic_buffer - это вызов libmagic.so. В коде ранее были сделаны другие успешные вызовы этой библиотеки. Этот вызов, однако, включает в себя базу данных lib magic /usr/share/file/magic.
Компиляция C ++ как исполняемого файла и запуск его на проблемной машине работает просто отлично.
Вот некоторые выводы:
A. Из-за # 4
есть участие JNI
B. Из-за # 1 / # 2 я не верю, что это проблема реализации JNI.
C. Из-за # 1, # 2 и # 4 я не верю, что это проблема реализации c ++.
Есть предложения или комментарии? (изначально работал на VMWare, сейчас тестируется без участия виртуальной машины)