繁体   English   中英

jna Native.LoadLibrary无法管理在服务器上加载库(在本地工作)

[英]jna Native.LoadLibrary does not manage to load library on server (working in local)

我使用JNA在Java项目中加载c ++库(.so)。 我将我的库打包到jar中,并在实例化使用它的java类时从jar中加载它。 我这样做是这样的:

  • mvn install编译c ++代码并将结果动态库打包在jar中。
  • 我在实例化LibraryWrapperClass时在静态上下文中调用以下内容

     System.load( temp.getAbsolutePath() ); 

其中temp是一个临时文件,其中包含在jar中找到的库。 这段代码基于在adamheinrich中找到的工作-我调用Native.loadLibrary(LIBRARYPATH)将库包装为Java类。

    private interface Wrapper extends Library {
        Wrapper INSTANCE = Native.loadLibrary( C_LIBRARY_PATH, Wrapper.class );

        Pointer Constructor();
        ...
    }
  • 我运行测试并验证是否找到了该库并使其正常运行。
  • 我使用了一个依赖于此项目的Java Web项目。 它使用tomcat,并且在本地运行良好。

我的问题是,当我在服务器上部署时,LibraryWrapperClass无法实例化。 服务器上的错误是:

java.lang.NoClassDefFoundError: Could not initialize class pacakgeName.LibraryWrapperClass
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:375)
    at org.hibernate.annotations.common.util.StandardClassLoaderDelegateImpl.classForName(StandardClassLoaderDelegateImpl.java:57)
    at org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl$4.classForName(MetadataBuilderImpl.java:758)
    at org.hibernate.annotations.common.reflection.java.JavaReflectionManager.classForName(JavaReflectionManager.java:144)
    at... 

似乎没有找到此错误,因为没有引发UnsatisfiedLinkError异常。 但是还有其他的失败。 有人知道会发生什么吗? 我该如何调试?

我记得在本地一切都很好。

我该如何调试?

1.与strace

strace将为您提供Tomcat试图打开的文件: strace -f -e trace=file -o log.txt bin/startup.sh

之后,在log.txt中查找packageName,或者在以下文件中找不到其他文件:

egrep ' open.*No such file' log.txt

2.使用JConsole

启用JMX,启动JConsole,转到VM摘要选项卡,并非常仔细地检查/比较VM参数/类路径/库路径/引导类路径

3.带有ldd的依赖项列表

如果可能是依赖关系问题,那么ldd sharedLibraryFile.so命令将列出所有依赖关系,并允许跟踪可能缺少的依赖关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM