调用一个类而不是另一个类的方法时,JNI不满意的链接错误

时间:2018-10-08 12:58:15

标签: java c++ dll java-native-interface native

我想使用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函数:

enter image description here

1 个答案:

答案 0 :(得分:0)

问题是System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");实际上并未使Java在给定路径中寻找.dll文件。它基本上什么也没做。那么,为什么测试适用于PointXYZ?将较旧的.dll放入项目根文件夹是我的错误,因此它实际上是在其中寻找方法。