java - 调用一个类的方法而不是另一个类的方法时出现 JNI Unsatisfied Link Error
问题描述
我想使用 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();
// ...
}
我已经为这个类生成了 C 头文件,javah
使用 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();
// ...
}
我已经检查了.dll
使用Dependency Walker生成的方法,并且PointXYZRGB
方法都存在。任何人都知道问题可能是什么?
更新:以下是.dll
评论中要求的功能:
解决方案
问题是它System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
实际上并没有让 Java.dll
在给定路径中查找文件。它基本上什么都不做。那么为什么测试适用于PointXYZ
?这是我将旧版本.dll
放入项目根文件夹的错误,因此它本质上是在其中寻找方法。
推荐阅读
- python - 在 python 中求解代数方程
- python - Mac 上 Python 和 ffmpeg 的权限问题
- c++ - 试图在自己的 .cpp 和 .h 文件中制作 Node
- c++ - Add a variable to a struct at runtime C++
- python - 函数可以返回 Python 中使用的另一个函数
- linux - X (Linux) 上的镜像窗口
- python - 在python中拆分字符串
- macos - 如何在 10.11 上安装 OS X 10.12 命令行工具?
- python - 为自定义图像数据创建类似于 mnist.train.next_batch(128) 的函数
- windows - 如何在powershell中自动对多个提示回答是