当前位置: 首页 > 知识库问答 >
问题:

NoClassDefFoundError调用Clojure从Java(Android,LibGDX)

丌官翰采
2023-03-14

我按照本教程使用Leiningen从Eclipse中的Java调用Clojure。我想在Clojure中编写游戏的AI,其余的则在Android操作系统的LibGDX中编写。

完成Clojure端后,我使用lein命令将其打包到jar文件中(#lein编译,#lein运行,#lein uberjar)。

我通过右键单击project添加jar文件

我的问题发生在我执行游戏时。

import myai.*;
public class Stack extends Actor {
   ...
   public void draw(SpriteBatch batch, float parentAlpha) {
      System.out.println("Binomial = " + core.binomial(5, 15));
   }
   ...
}

我收到这个错误:

12-26 00:27:01.570: I/dalvikvm(8384): Could not find method myai.core.binomial, referenced from method my.package.Stack.draw
12-26 00:27:01.570: E/AndroidRuntime(2281): FATAL EXCEPTION: GLThread
12-26 00:27:01.570: E/AndroidRuntime(2281): java.lang.NoClassDefFoundError: myai.core
12-26 00:27:01.570: E/AndroidRuntime(2281):     at my.package.Stack.draw(Stack.java:297)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at my.package.GameScreen.render(GameScreen.java:146)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at com.badlogic.gdx.Game.render(Game.java:46)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at my.package.MyGame.render(MyGame.java:23)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:487)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at com.badlogic.gdx.backends.android.surfaceview.GLSurfaceViewCupcake$GLThread.guardedRun(GLSurfaceViewCupcake.java:713)
12-26 00:27:01.570: E/AndroidRuntime(2281):     at com.badlogic.gdx.backends.android.surfaceview.GLSurfaceViewCupcake$GLThread.run(GLSurfaceViewCupcake.java:646)

我真的不知道为什么会这样,因为我已经遵循了教程中的所有步骤。

这些是我的clojure文件:

project.clj

(defproject myai "0.1.0-SNAPSHOT"
  :description "AI for my game"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]]
  :aot [myai.core]
  :main myai.core)

core.clj

(ns myai.core
  (:gen-class
    :name myai.core
    :methods [#^{:static true} [binomial [int int] double]])
  )

(defn binomial
  "Calculate the binomial coefficient."
  [n k]
  (let [a (inc n)]
    (loop [b 1
           c 1]
      (if (> b k)
        c
        (recur (inc b) (* (/ (- a b) b) c))))))

(defn -binomial
  "A Java-callable wrapper around the 'binomial' function."
  [n k]
  (binomial n k))

(defn -main
  [& args]
  (println "My Game Artificial Intelligence")
  (println (str "(binomial 5 3): " (binomial 5 3)))
  )

提前感谢!:)

编辑:它在Ubuntu中也不能使用命令行命令。

共有1个答案

岳谦
2023-03-14

多么愚蠢的错误。。。我忘了检查Clojure。属性中的jar文件

 类似资料:
  • 从Clojoure调用Java非常简单明了,但反过来已被证明是不可预测的。 它们似乎有两种方式: 1)以下类别 2) 将clojure编译成uberjar,然后将其导入java代码。 我选择了第二个选项,因为它更直接。 这是clojure代码 这是Java代码。 当我做出“service.returned(4);”时,系统永远不会返回。我不太明白为什么对我来说,它会像函数没有从Clojure返回一

  • 问题内容: 对于“从Java调用Clojure”而言,大多数Google热门歌曲都已过时,建议您使用它clojure.lang.RT来编译源代码。假设您已经从Clojure项目构建了一个jar并将其包含在类路径中,那么您能否帮助您清楚地说明如何从Java调用Clojure? 问题答案: 从Clojure 1.6.0开始,有一种新的首选方式来加载和调用Clojure函数。现在,此方法优于直接调用RT

  • 问题内容: 我有Clojure功能。 源代码: https://github.com/8protons/url62/blob/master/src/url62/core.clj 我需要从Java执行此功能。 我尝试使用这样的代码: 但这不起作用: 问题答案: 您忘记了Clojure命名空间: 这是项目结构: 和文件: 这是调用嵌入式Clojure函数的Java类: Clojure文件: Cloju

  • 我想用Java将一个文件放入Windows中的回收站。以便用户能够还原它。

  • 在Java里面调用 Clojure 提前编译的Clojure函数如果是静态的函数的话,那么它们可以被java程序调用。可以通过把函数的元数据项: :static 设置为 true 来达到这个目的。语法是这样的: (ns <em>namespace</em> (:gen-class :methods [#^{:static true} [<em>function-name</em> [<e

  • 我正在尝试构建一个使用javamail和gmail的smtp服务发送电子邮件的应用程序,但是当我运行它时,当我调用Session.getInstance时,它会崩溃。调试后,它似乎是关于com.sun.mail.util.MailLogger的NoClassDefFoundError。我在其他地方读到,为了获得它,我必须添加一个较旧的邮件包,但我仍然遇到错误。 以下是我在Android Studi