提问者:小点点

处理2.2.1视频-抽象方法错误-GStreamer/JNA不匹配?


我正在尝试使用处理视频2.2.1作为我(Scala)项目中的库。我可以直接在处理IDE中运行演示捕获草图,但是从我的项目中我得到一个看起来像版本不匹配的错误:

Exception in thread "Animation Thread" java.lang.AbstractMethodError: com.sun.jna.Structure.getFieldOrder()Ljava/util/List;
    at com.sun.jna.Structure.fieldOrder(Structure.java:868)
    at com.sun.jna.Structure.getFields(Structure.java:894)
    at com.sun.jna.Structure.deriveLayout(Structure.java:1042)
    at com.sun.jna.Structure.calculateSize(Structure.java:966)
    at com.sun.jna.Structure.calculateSize(Structure.java:933)
    at com.sun.jna.Structure.allocateMemory(Structure.java:360)
    at com.sun.jna.Structure.<init>(Structure.java:184)
    at com.sun.jna.Structure.<init>(Structure.java:172)
    at com.sun.jna.Structure.<init>(Structure.java:159)
    at com.sun.jna.Structure.<init>(Structure.java:151)
    at org.gstreamer.lowlevel.GObjectAPI$GTypeInstance.<init>(GObjectAPI.java:114)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at com.sun.jna.Structure.newInstance(Structure.java:1635)
    at com.sun.jna.Structure.newInstance(Structure.java:1621)
    at com.sun.jna.Structure.size(Structure.java:950)
    at com.sun.jna.Native.getNativeSize(Native.java:1076)
    at com.sun.jna.Structure.getNativeSize(Structure.java:1927)
    at com.sun.jna.Structure.getNativeSize(Structure.java:1920)
    at com.sun.jna.Structure.validateField(Structure.java:1018)
    at com.sun.jna.Structure.validateFields(Structure.java:1032)
    at com.sun.jna.Structure.<init>(Structure.java:179)
    at com.sun.jna.Structure.<init>(Structure.java:172)
    at com.sun.jna.Structure.<init>(Structure.java:159)
    at com.sun.jna.Structure.<init>(Structure.java:151)
    at org.gstreamer.lowlevel.GObjectAPI$GParamSpec.<init>(GObjectAPI.java:395)
    at org.gstreamer.GObject.findProperty(GObject.java:656)
    at org.gstreamer.GObject.set(GObject.java:87)
    at processing.video.Capture.initGStreamer(Unknown Source)
    at processing.video.Capture.<init>(Unknown Source)
    at (my sketch)

MavenPOM文件在这里。我最终在类路径上得到了以下库:

  • com. google code.g流媒体-java:g流媒体-java:1.5
  • net.java.dev. jn a:jn a:4.0.0
  • net.java.dev. jn a:平台:3.4.0
  • org.处理: core:2.2.1
  • org.处理: video:2.2.1

我的直觉是jna和平台之间不匹配——它们应该有相同的版本吗?这将表明发布的POM是错误的。处理独立使用哪个版本?不幸的是,那里的罐子剥夺了版本信息。


共2个答案

匿名用户

事实上,处理POM似乎指定了不兼容的JNA版本。在sbt中,我可以使用依赖项Overrides声明来解决这个问题:

def processingVersion  = "2.2.1"
def gstreamerVersion   = "1.5"
def jnaVersion         = "3.4.0"

libraryDependencies ++= Seq(
  "org.processing" % "video" % processingVersion,
  "com.googlecode.gstreamer-java" % "gstreamer-java" % gstreamerVersion
)

dependencyOverrides += "net.java.dev.jna" % "jna" % jnaVersion // !

匿名用户

对于gradle peep那是:

implementation ("org.processing:core:3.3.7") {
    exclude group: 'net.java.dev.jna'
}
// https://mvnrepository.com/artifact/org.processing/video
implementation ("org.processing:video:3.3.7) {
    exclude group: 'net.java.dev.jna'
}
// higher jna versions have abstract Structure.getFieldOrder which gstreamer doesn't implement
implementation "net.java.dev.jna:jna:3.4.0"