JNI 不满意 Link 调用一个 class 而不是另一个的方法时出错
JNI Unsatisfied Link Error when calling the methods of one class but not the other
我想使用 JNI 在 Java 代码中包装一个 C++ 库 (PCL),但结果不一致。我首先创建了一个 PointXYZ
class 用于测试,它看起来像这样:
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
为这个 class 生成了 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
}
现在,我对继承自 PointXYZ
的 PointXYZRGB
class 执行了完全相同的步骤,当我尝试测试它抛出 java.lang.UnsatisfiedLinkError
时。这是 class:
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
函数:
问题是 System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
实际上并没有让 Java 在给定路径中查找 .dll
文件。它基本上什么都不做。那为什么测试对 PointXYZ
有效?这是我将旧的 .dll
放入项目根文件夹的错误,所以它实际上是在寻找方法。
我想使用 JNI 在 Java 代码中包装一个 C++ 库 (PCL),但结果不一致。我首先创建了一个 PointXYZ
class 用于测试,它看起来像这样:
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
为这个 class 生成了 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
}
现在,我对继承自 PointXYZ
的 PointXYZRGB
class 执行了完全相同的步骤,当我尝试测试它抛出 java.lang.UnsatisfiedLinkError
时。这是 class:
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
函数:
问题是 System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
实际上并没有让 Java 在给定路径中查找 .dll
文件。它基本上什么都不做。那为什么测试对 PointXYZ
有效?这是我将旧的 .dll
放入项目根文件夹的错误,所以它实际上是在寻找方法。