Я хочу обернуть библиотеку 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](https://i.stack.imgur.com/Iwb5q.png)