JNI Unsatisfied Link Ошибка при вызове методов одного класса, но не другого - PullRequest
0 голосов
/ 08 октября 2018

Я хочу обернуть библиотеку C ++ ( PCL ) в код Java с использованием JNI, но у меня противоречивые результаты.Сначала я создал класс PointXYZ для тестирования, и он выглядит следующим образом:

package pcl;

public class PointXYZ extends NativeObject {

    PointXYZ() { }

    @Override
    public native void alloc();    // creates pointer + handle on the native side

    @Override
    public native void dispose();  // sets handle to 0 and deletes pointer

    public native float getX();

    // ...

}

Я сгенерировал заголовок C для этого класса, используя javah, скомпилировал все с помощью CMake, протестировал его с помощью его получателейи сеттеры, и все работает отлично.

    static {    
        System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
        System.loadLibrary("pcl_java_common");
    }

    @Test
    void attributeAccessTest() {
        PointXYZ p = new PointXYZ();

        p.alloc();

        p.setX(3);

        assertEquals(p.getX(), 3);

        p.dispose();

        // all is good
    }

Теперь я проделал те же самые шаги для класса PointXYZRGB, который наследуется от PointXYZ, и когда я пытаюсь проверить, что он выдает java.lang.UnsatisfiedLinkError.Вот класс:

package pcl; 

public class PointXYZRGB extends PointXYZ {

    public PointXYZRGB() { }

    @Override
    public native void alloc();

    @Override
    public native void dispose();

    public native short getR();

    // ...

}

Я проверил сгенерированный .dll, используя Dependency Walker и все методы PointXYZRGB присутствуют.Кто-нибудь знает, в чем может быть проблема?

ОБНОВЛЕНИЕ: Ниже приведены .dll функции, запрошенные в комментарии:

enter image description here

1 Ответ

0 голосов
/ 10 октября 2018

Проблема заключалась в том, что System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib"); на самом деле не заставляет Java искать .dll файлы по указанному пути.По сути, это ничего не делает.Тогда почему тесты работают на PointXYZ?Это была моя ошибка - положить более старый .dll в корневую папку проекта, поэтому он по сути искал в этом методы.

...