首页 > 解决方案 > 调用一个类的方法而不是另一个类的方法时出现 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评论中要求的功能:

在此处输入图像描述

标签: javac++dlljava-native-interfacenative

解决方案


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


推荐阅读