Clojure和64位lwjgl(lein 2)

时间:2013-02-04 23:41:37

标签: clojure leiningen jmonkeyengine

在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让我失望了。我很感激任何人都可以提出任何建议。

提前致谢!

3 个答案:

答案 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

BTW,看起来leiningen支持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"]])