【问题标题】:Issues with screen capture using com sun JNA : undefined symbol: GetDesktopWindow使用 com sun JNA 的屏幕捕获问题:未定义符号:GetDesktopWindow
【发布时间】:2017-06-01 20:33:58
【问题描述】:

我正在一个网站上工作,我必须构建一个模块来捕获点击事件的网页屏幕。我在 SO 中引用了一些帖子,并尝试使用 Robot (java.awt.Robot) 和 JNA (com.sun.jna.*),当我从本地机器或本地 tomcat 服务器尝试时,这两种情况都成功了。它确实捕获了网页,我使用的是 Java 1.7

当我在我的 Ubuntu (Ubuntu 14.04.4) 中部署代码时,我开始在这两种情况下都遇到了挑战。

对于 JNA,我不断收到如下所述的异常。仅供参考,我已经提到了我在 Ubuntu 中使用的 Java 版本。我确信这与配置有关,或者我不确定系统是否没有正确选择我的 Java 版本。任何指导都会有所帮助。我通过互联网参考,但没有找到解决此问题的任何指导

我使用的Java版本是javac 1.7.0_131 (java-7-openjdk-amd64)

java.lang.UnsatisfiedLinkError: Error looking up function 'GetDesktopWindow': /usr/lib/jvm/default-java/bin/java: undefined symbol: GetDesktopWindow
    at com.sun.jna.Function.<init>(Function.java:212) ~[jna-4.2.2.jar:4.2.2 (b0)]
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:541) ~[jna-4.2.2.jar:4.2.2 (b0)]
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:518) ~[jna-4.2.2.jar:4.2.2 (b0)]
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:504) ~[jna-4.2.2.jar:4.2.2 (b0)]
    at com.sun.jna.Library$Handler.invoke(Library.java:220) ~[jna-4.2.2.jar:4.2.2 (b0)]
    at com.boot.service.$Proxy118.GetDesktopWindow(Unknown Source) ~[na:na]
    at com.boot.service.AuditService.getScreenshot(AuditService.java:133) ~[AuditService.class:na]
    at com.boot.service.AuditService.captureScreen(AuditService.java:118) ~[AuditService.class:na]
    at com.boot.service.AuditService.captureScreenshotAndStore(AuditService.java:66) ~[AuditService.class:na]
    at com.boot.controller.AuditController.captureScreenshotAndStore(AuditController.java:38) ~[AuditController.class:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_131]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_131]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_131]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_131]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]

当我列出我的 JVM 文件夹时,这些是我看到的不同版本的 Java, default-java java-1.7.0-openjdk-amd64 java-7-openjdk-amd64 java-7-oracle java-8-oracle

使用 Robot,它在我的本地运行良好,但在 Ubuntu 中失败并出现以下错误。

java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit
    at java.lang.Class.forName0(Native Method) ~[na:1.7.0_131]
    at java.lang.Class.forName(Class.java:195) ~[na:1.7.0_131]
    at java.awt.Toolkit$2.run(Toolkit.java:869) ~[na:1.7.0_131]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_131]
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:861) ~[na:1.7.0_131]

我提到了一些要求将无头变量更新为 true 的帖子。我正在使用 Spring boot,但不确定如何设置它,但我做了 System.setProperty("java.awt.headless", "false");作为服务构造函数的一部分。它也没有帮助

【问题讨论】:

    标签: java ubuntu jna


    【解决方案1】:

    GetDesktopWindow 函数是 Microsoft Windows API 的一部分。在 Linux 环境下运行它是行不通的。我相信它可以在您的机器上运行,因为您的 PC 是 Microsoft Windows 操作系统。


    There is an OS independent solution, here on SO 满足您的要求。

    【讨论】:

    • 是的,它是 Windows 操作系统。有没有其他选择或者我应该探索?我的意思是代替这种方法,我不确定的其他方法很少..
    • 其实这是我的第一选择。它在我的本地机器上运行良好,但在 Ubuntu 中,我开始收到与 ToolKit 相关的异常。我在我的帖子中更新了同样的内容
    • 现在我得到这个错误。 java.lang.NoClassDefFoundError:无法初始化类 sun.awt.X11GraphicsEnvironment。在服务器上运行时如何设置headless = true
    • @CrazyMac 请尝试和谷歌搜索可能的解决方案。 SO上有很多已回答的问题可以回答您的问题,例如SO question
    • 我明白,我确实参考了所有这些帖子,然后我就在这里。当我在应用程序中将 headless 设置为 true 时,它​​会引发不同的错误。如何在服务器级别设置此值。我的意思是这个 java.awt.headless=true
    猜你喜欢
    • 2020-03-16
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2013-11-13
    • 2014-09-28
    相关资源
    最近更新 更多