在64位JVM上,在Linux中,无论本机库加载什么都坚持尝试加载32位库。
我问这是一个clojure和(甚至更多)java n00b。
我到目前为止找到的答案(Using lwjgl in Leiningen/Clojure似乎是搜索结果中最突出的)似乎是旧版本的lein,问题围绕着:native-dependencies或LD_LIBRARY_PATH在项目中。 CLJ。
我正在重新发明轮子并将基本的jME教程翻译成clojure作为一个小小的个人家庭作业,以学习它们。在迄今为止我发现人们如何做到这一点的所有教程和示例中,这部分似乎“只是工作。”
(就Windows而言,它在Windows下运行正常)。
我正在使用lein构建一个新的空项目。我已经在clojars上设置了各种版本的jMonkeyEngine库的依赖项。在'lein deps'之后,liblwjgl64.so和libopenal64.so将在我的项目目录的根目录中结束。
当我尝试'lein run'时,它会显示设置的Monkey splash屏幕,然后在尝试实际运行时抛出异常,因为它正在尝试加载liblwjgl.so。
该文件存在于target / native / linux和target / native / linux64下(但奇怪的是,不在target / native / linux32下)。
如果我将它想要的文件复制到项目的根目录中,则错误会更改为“错误的ELF类:ELFCLASS32(可能的原因:架构字宽度不匹配)”,这是Google一直在给我的另一组讨论。这里提到的解决方案似乎都等于“切换到32位JVM以使Minecraft正常工作”,但我更倾向于获得有关正在发生的事情的实际线索。
这个问题在我可以在clojars中得到的每一组依赖库都非常一致(回到版本2,无论如何......那些有更大的问题,似乎不值得深入研究)。查尔斯污渍在窗户上为我设置了“Just Worked”。
到目前为止,我能够提出的最好的假设是这样做的:
我怀疑某个版本必须在某个时候指定。 http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.html#resources提到了一个看起来非常合适的资源属性,但这似乎与JNLP没有任何关系。我想知道是否有一个明显的文件坐在.jar的某个地方我无法找到(这里是我的n00bishness发挥作用...我真的不知道我在寻找什么)。
那么,有没有人对我应该在哪里或者我应该问什么有任何指示?我不知道甚至不知道从哪里开始。讨论jMonkeyEngine论坛,#clajure或lwjgl邮件列表(或者他们使用的任何东西......我实际上根本没有看到他们的一面......我应该吗?)
接下来我要尝试的是将jME库捆绑到我自己的存储库中。这似乎是一项艰巨而艰巨的任务,当我正在解决这个角度时,我决定在这里提出要求。
我知道这很模糊,我为此道歉。我的google-fu让我失望了。我很感激任何人都可以提出任何建议。
提前致谢!
答案 0 :(得分:1)
我知道这是一个老问题,但我在决定参与Clojure + jMonkeyEngine项目时发现了它。我花了一些时间与clojars中的包斗争,然后研究构建我自己的maven包需要什么,我在jMonkeyEngine wiki上发现了一个有严厉警告的页面:
请注意,既不建议也不支持将jME3与maven一起使用 由核心jME团队和maven存储库中的库可能 过时了!
后来我发现通过将他们的jar直接放在我的项目中,并使用leiningen的:resource-paths config将它们包含在类路径中,我能够成功运行最小的JME应用程序。
通过下载JME3 SDK找到jars,并查看jmonkeyplatform / jmonkeyplatform / libs。将所有罐子复制到项目内的“lib”文件夹中(是的,你可以删除你不会使用的罐子)。然后像这样配置你的lein项目:
(defproject my-jme-project "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.5.1"]]
:resource-paths ["resources" "lib/*"])
运行lein-repl,以下内容应启动最小的JME3应用程序:
(import 'com.jme3.app.SimpleApplication)
(def app (proxy [SimpleApplication] [] (simpleInitApp [] nil)))
(.start app)
答案 1 :(得分:0)
在Java程序中使用本机库起初可能很痛苦,但实际上并不是那么复杂。
首先,您的错误wrong ELF class: ELFCLASS32
表示某些 64位程序尝试加载 32位共享库。显然,当程序查找库的路径上存在具有所需名称的32位库时,会发生这种情况,但程序本身是64位的。这几乎都是为了解释错误。
现在,关于问题的主要部分。确实有几种方法可以将本机库与Java应用程序一起使用,其中一些方法甚至涉及环境变量。但IMO最简单的方法是指定Java 系统属性 java.library.path
,它主要用于管理本机库。此属性应指向程序的所有本机库所在的目录。 JVM将查看该目录中所有必需的共享对象。
直接运行JAR文件时,可以在命令行中指定系统属性,如下所示:
java -Djava.library.path=natives/linux64 -jar yourprogram.jar
在这里,我们重新指定相对于当前目录的库的路径。就我而言,这是为独立应用程序设置属性的首选方法,通常由脚本启动。
对于REPL,似乎可以在project.clj
内为它设置JVM选项,如下所示:
(defproject project "version"
...
:jvm-opts ["-Djava.library.path=target/natives/linux64"])
我不记得什么是REPL的默认工作目录,所以这可能需要对确切的路径进行一些实验,但你已经明白了。
现在我自己开发lwjgl程序(虽然不是在Clojure中,而是在普通的Java中,使用Maven),所有真正需要的是从jar中提取本机库(maven-native-plugin
这样做)和为他们设置java.library.path
。
project.clj
,:native-path
中的另一个重要选项,它似乎启用了类似maven-native-plugin
的功能:它指定了一个目录,所有本机依赖项都应该被提取。将其与:jvm-opts
结合使用可以为您提供正确的平台无关REPL:)
答案 2 :(得分:0)
还是老问题,但是我遇到了同样的问题,所以我能够通过在project.clj
文件上添加jCenter存储库来设置关闭的jME3:
(defproject example-project "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:repositories [["jcenter" "http://jcenter.bintray.com"]]
:dependencies [[org.clojure/clojure "1.6.0"]
[org.jmonkeyengine/jme3-core "3.1.0-beta1"]
[org.jmonkeyengine/jme3-desktop "3.1.0-beta1"]
[org.jmonkeyengine/jme3-lwjgl "3.1.0-beta1"]])