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
    }

现在,我对继承自 PointXYZPointXYZRGB 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 放入项目根文件夹的错误,所以它实际上是在寻找方法。