Сбой библиотеки JNI с изменением файла .c, который не включен в Makefile - PullRequest
0 голосов
/ 05 сентября 2011

Мы столкнулись с необычной проблемой, наша библиотека JNI падает во время загрузки.для разработки мы используем CentOS 5.4 / G ++ и VS2005. Сценарий

: в настоящее время мы работаем над усовершенствованием нашего продукта и хотим передать новую информацию обратно в код Java-сервера, используя JNI.наш код C / C ++ работает нормально, и мы проверили его, запустив примерно 6 часов или около того в нашей среде разработки.мы обновили две структуры результатов (которые уже присутствовали) с одним длинным значением, каждое для передачи результата нашего нового улучшения.

когда мы обновили код JNI для передачи результата в код Java, мы нашличто Java-сервер падает при загрузке JNI, мы выполнили отладку и обнаружили, что JNI lib падает, даже когда у нас нет изменений в базе кода JNI lib.

в нашей дальнейшей отладке мы обнаружили, что JNI Makefileвключает в себя файл .c (aa.c), в котором есть несколько наших изменений для нового улучшения;мы начали с комментирования наших изменений в этом файле aa.c один за другим и обнаружили, что сбой происходит только тогда, когда у нас есть вызов BBB.cpp :: method1 () (который мы добавили как часть нашего нового улучшения).

Необычная часть в том, что этот файл .c (aa.c) не нужен в библиотеке JNI, и у нас нет никаких методов aa.c, вызываемых из библиотеки JNI;Теперь мы удалили aa.c из Makefile JNI и прекрасно скомпилировали, но все равно вылетает, когда у нас есть вызов BBB.cpp :: method1 (), если мы удалим этот вызов method1 (), тогда он будет работать нормально.

мы не уверены, почему / как он ссылается на файл, который не включен, в Makefile и дает сбой.

это журнал ошибок, который мы видим


AgentServer #0 запущено: OK 12750 [Connection # Cnx: # 0.0.1026: 0 - Session # c0s1] ОШИБКА com.xx.xxx.xxxx - Невозможно загрузить библиотеку JNI BBBController java.lang.UnsatisfiedLinkError: / opt / XXXXX / lib / libjnixxx.so: Не удается загрузить 32-разрядный IA .so на 32-разрядной платформе IA в java.lang.ClassLoader $ NativeLibrary.load (собственный метод) в java.lang.ClassLoader.loadLibrary0 (ClassLoader.java:1751) вjava.lang.ClassLoader.loadLibrary (ClassLoader.java:1676) в java.lang.Runtime.loadLibrary0 (Runtime.java:822) в java.lang.System.loadLibrary (System.java:993)


Пожалуйста, предложите, любая идея будет оценена.

Заранее спасибо,

Aqurа

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

наконец, мы можем решить эту проблему.

Мы видели эту проблему, потому что Makefile, который мы использовали для сборки библиотеки JNI, содержал много файлов .o, которые не были нужны для сборки. один из файлов оказался тем, который мы модифицировали, но другие зависимые файлы не были включены в Makefile, и это вызывало сбой во время загрузки, поскольку он не смог разрешить ссылки.

чтобы найти и исправить проблему, мы создали простой Java-класс, который просто загружает libjni.so, он дал нам неопределенные ссылки на метод, который мы искали, и начал исправлять ненужные. Я знаю, что это был грубый метод, и потребуется некоторое время, чтобы найти и исправить исходную проблему. Это сработало для нас, поэтому я подумал, что поделюсь этим с другими.

AQURA

0 голосов
/ 15 сентября 2011

Я бы посоветовал вам попробовать включить отладку в ld.so.1 при запуске приложения и посмотреть, дает ли это какие-либо подсказки. Смотрите LD_DEBUG в http://linux.die.net/man/8/ld-linux

...