我想使用JNI在Java代码中包装C ++库(PCL),但是结果不一致。我首先创建了一个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();
// ...
}
我已经使用javah
为该类生成了C头文件,并使用CMake编译了所有内容,并使用其getter和setter方法对其进行了测试,一切正常。
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();
// ...
}
我已经使用Dependency Walker检查了生成的.dll
,并且PointXYZRGB
方法都存在。有人知道可能是什么问题吗?
更新:以下是注释中要求的.dll
函数:
答案 0 :(得分:0)
问题是System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
实际上并未使Java在给定路径中寻找.dll
文件。它基本上什么也没做。那么,为什么测试适用于PointXYZ
?将较旧的.dll
放入项目根文件夹是我的错误,因此它实际上是在其中寻找方法。