10

64ビットJVMでは、Linuxでは、ネイティブライブラリのロードは、32ビットライブラリのロードを試みることを要求します。

私はこれをclojureおよび(さらに)javan00bとして求めています。

私がこれまでに見つけた答え(Leiningen / Clojureでlwjglを使用すると、検索結果で最も目立つようです)は、project.cljの:native-dependenciesまたはLD_LIBRARY_PATHの周りで問題が渦巻く、古いバージョンのleinのようです。

私は車輪の再発明を行い、基本的なjMEチュートリアルを、両方を学ぶためのちょっとした個人的な宿題としてclojureに変換しています。これまでに私が見つけたすべてのチュートリアルと例で、これをどのように行ったかを示している人々の中で、この部分は「うまく機能している」ようです。

(それは、Windowsの下で私にとってはうまくいきました)。

私はleinを使用して、新しい空のプロジェクトを構築しています。clojar上のjMonkeyEngineライブラリのさまざまなバージョンへの依存関係を設定しました。'lein deps'の後、liblwjgl64.soとlibopenal64.soがプロジェクトディレクトリのルートに表示されます。

'lein run'を実行しようとすると、設定のモンキースプラッシュ画面が表示され、liblwjgl.soをロードしようとしているため、実際に実行しようとすると例外がスローされます。

そのファイルは、target / native/linuxおよびtarget/native / linux64の下にあります(ただし、奇妙なことに、target / native / linux32の下にはありません)。

必要なファイルをプロジェクトのルートにコピーすると、エラーが「間違ったELFクラス:ELFCLASS32(考えられる原因:アーキテクチャの単語幅の不一致)」に変わります。これは、Googleが私に提供し続ける他の一連のディスカッションです。そこに記載されている解決策はすべて「Minecraftを機能させるために32ビットJVMに切り替える」ことになるようですが、実際に何が起こっているのかについての手がかりを得たいと思います。

この問題は、clojarで手に入れることができる依存関係ライブラリのすべてのセットで非常に一貫しています(とにかく、バージョン2に戻ります...それらには、掘り下げる価値がないように思われる大きな問題がありました)。チャールズステインセット「JustWorked」を窓に貼ってくれました。

私がこれまでに思いついた最高の仮説は、これらの線に沿って何かを実行します。

ある時点でバージョンを指定する必要があるのではないかと思います。http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.html#resourcesは、完全に適合しているように見えるリソースプロパティについて言及していますが、これには何もありません。 JNLPで行います。.jarのどこかに、見つけられなかったマニフェストファイルがあるかどうか疑問に思っています(ここで私のn00bishnessが機能します...私が探しているものの手がかりが本当にありません)。

それで、誰かが私がどこを見るべきか、または私が誰に尋ねるべきかについての指針を持っていますか?ここからどこへ行けばいいのかわからない。jMonkeyEngineフォーラム、#clojure、またはlwjglメーリングリスト(またはそれらが使用するものは何でも...私は実際に彼らの側をまったく調べていません...私はすべきですか?)

次に試すのは、jMEライブラリを自分のリポジトリにバンドルすることです。それは、私がその角度に取り組んでいる間、私がここで尋ねることに決めた、大きくて気が遠くなるような十分な仕事のように思えます。

私はこれが曖昧であることを知っています、そして私はそれをお詫びします。私のgoogle-fuは私に失敗しました。誰でも思いつくことができる提案をいただければ幸いです。

前もって感謝します!

4

3 に答える 3

1

これは古い質問であることは承知していますが、Clojure + jMonkeyEngine プロジェクトに取り組むことを決定したときに見つけました。clojar 内のパッケージと格闘し、独自の Maven パッケージを構築するには何が必要かを調べたところ、jMonkeyEngine wiki で次のような厳しい警告のあるページを見つけました。

jME3 を maven で使用することは、コア jME チームによって推奨もサポートもされておらず、maven リポジトリ内のライブラリが古くなっている可能性があることに注意してください。

後で、jar ファイルをプロジェクトに直接配置し、leiningen の :resource-paths 構成を使用してクラスパスに含めることで、最小限の JME アプリを正常に実行できることがわかりました。

JME3 SDK をダウンロードし、jmonkeyplatform/jmonkeyplatform/libs を調べて、jar を見つけます。すべての jar をプロジェクト内の「lib」フォルダーにコピーします (はい、使用しない jar を削除できます)。次に、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)
于 2013-11-14T01:48:53.597 に答える
0

project.cljまだ古い質問ですが、同じ問題が発生したため、jCenter リポジトリをファイルに追加することで、Closure に 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"]])
于 2016-10-12T15:16:59.900 に答える
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ではなく、Mavenを使用してプレーンJavaで)、本当に必要なのは、jarからネイティブライブラリを抽出maven-native-pluginし(これを行います)、それらに設定java.library.pathすることだけです。

ところで、leiningen は , で別の重要なオプションをサポートしているproject.cljようです。これにより、機能:native-pathのようなものが有効になるようですmaven-native-plugin。すべてのネイティブ依存関係を抽出するディレクトリを指定します。これを と組み合わせると、:jvm-optsプラットフォームに依存しない正しい REPL が得られるはずです:)

于 2013-02-05T05:18:18.600 に答える