#java #cuda #java-native-interface
#java #cuda #java-native-interface
Вопрос:
Я пытаюсь запустить пример JCuda в Debian Linux (32 бит). Поскольку на веб-сайте JCuda для Linux x86 нет доступных двоичных файлов, я дополнил библиотеки. Теперь я пытаюсь запустить пример deviceQuery, но получаю следующие ошибки:
Ошибка при загрузке собственной библиотеки "JCudaDriver-linux-x86" с базовым именем "JCudaDriver" Название операционной системы: Linux Архитектура: i386 Размер бита архитектуры: 32 Трассировка стека при попытке загрузить библиотеку в качестве ресурса: java.lang.Исключение NullPointerException: не найден ресурс с именем '/lib/libJCudaDriver-linux-x86.so' в jcuda.LibUtils.loadLibraryResource(LibUtils.java:144) в jcuda.LibUtils.LoadLibrary(LibUtils.java:80) в jcuda.driver.JCudaDriver.(JCudaDriver.java:192) в jcudatest.JCudaTest.main(JCudaTest.java:29) Трассировка стека при попытке загрузить библиотеку в виде файла: java.lang.Ошибка неудовлетворительной ссылки: /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/библиотека / libjcudadriverjni-linux-x86.so: /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/библиотека/libJCudaDriver-linux-x86.so:неопределенный символ: Pointer_buffer в java.lang.Загрузчик классов $NativeLibrary.load(собственный метод) в java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807) в java.lang.ClassLoader.LoadLibrary(ClassLoader.java:1732) в java.lang.Runtime.loadLibrary0(Runtime.java:823) в java.lang.System.LoadLibrary(System.java: 1028) в jcuda.LibUtils.LoadLibrary(LibUtils.java:90) в jcuda.driver.JCudaDriver.(JCudaDriver.java:192) в jcudatest.JCudaTest.main(JCudaTest.java:29) Исключение в потоке "main" java.lang.Ошибка UnsatisfiedLinkError: не удалось загрузить собственную библиотеку в jcuda.LibUtils.LoadLibrary(LibUtils.java:122) в jcuda.driver.JCudaDriver.(JCudaDriver.java:192) в jcudatest.JCudaTest.main(JCudaTest.java:29) Результат Java: 1
Я полагаю, что ошибка здесь связана с этим неопределенным символом Pointer_buffer, поскольку я создал символические ссылки в /lib, и эта папка находится в переменных ПУТИ (я вижу, что она разрешает символическую ссылку на /home/rui/Downloads/JCuda-All-0.4.0-beta1-src/JCudaDriverJNI/lib/libJCudaDriver-linux-x86.so как и предполагалось).
Все работает и с Cuda, поскольку я могу компилировать и запускать примеры Cuda. Версия Cuda — 4.0.17 и JCuda 0.4.0-beta1 (на веб-сайте JCuda я вижу версию 0.4.0-beta1. Эти библиотеки были скомпилированы для CUDA 4.0 (сборка 17), поэтому я думаю, что здесь у меня тоже нет никакой несовместимости).
Я настраиваю свой проект на Netbeans и включил исходные файлы, присутствующие в папке JcudaJava. Нужно ли мне включать файлы cpp и hpp из папок JCudaDriverJNI и JCudaRuntimeJNI (я никогда раньше не работал с JNI, на самом деле не знаю, что мне нужно включить).
Заранее спасибо,
Rui
Ответ №1:
«Неопределенный символ» означает, что определение символа (переменной, функции) не найдено. JCuda определяет Pointer_buffer
в CommonJNI/PointerUtils.cpp так что, должно быть, была какая-то проблема, включая PointerUtils.o в файле .so. Были ли какие-либо ошибки при компиляции?