代码之家  ›  专栏  ›  技术社区  ›  vladek

调用一个类而不是另一个类的方法时出现JNI未满足的链接错误

  •  0
  • vladek  · 技术社区  · 6 年前

    PCL )在Java代码中使用JNI,但是我得到了不一致的结果。我首先创建了一个 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 ,使用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 继承自的类 点XYZ 当我试着测试它抛出 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 以及 方法都存在。有人知道问题出在哪里吗?

    更新: .dll文件 评论中要求的功能:

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   vladek    6 年前

    问题是 System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib"); 实际上并没有让Java寻找 .dll PointXYZ ? 这是我的错误,把一个旧的 到项目根文件夹中,所以它实际上是在其中查找方法。