【问题标题】:java.lang.NoSuchMethodError: org.json.JSONObject.getNames on Android due to conflicting librariesjava.lang.NoSuchMethodError: org.json.JSONObject.getNames on Android 由于库冲突
【发布时间】:2015-01-08 01:15:26
【问题描述】:

我正在使用 libgdx 在 java 中创建一个跨平台应用程序。我在核心项目中使用 Json 并尝试在 Android 上部署时收到此错误:

E/AndroidRuntime(2030): java.lang.NoSuchMethodError: org.json.JSONObject.getNames

我翻阅了一下,发现 Android 有一个内置的 Json 库,它使用与我添加到我的核心项目中的 Json 库相同的包名称。我使用的库有 getName() 方法,Android 库有一个 name() 方法。有没有办法让我指定我想使用的库?或者,有没有办法让我忽略 Android 库?

更新:我在我的 android 项目中使用

测试了访问 JSON 方法
JSONObject.getNames(TEST);

这应该给我null,而是给了我同样的错误。

【问题讨论】:

  • 您可以控制它,只需检查您在 .java 文件中导入了哪些库,如果是您使用的库,则可以,但如果是本机库,我想这就是原因,您应该删除它。
  • 我想我要说的是它们都有相同的包名称,所以我认为线路在某处交叉,并且应用程序错误地使用了 androids 库而不是我添加的库。他们都使用 org.json.*
  • 我知道,但只要你只导入你需要的,就没有问题,如果你这样做了,请确保问题是由其他原因引起的。
  • 我不确定还有什么问题。该应用程序在桌面上运行良好。

标签: android json libgdx


【解决方案1】:

如果你碰巧使用了一个 lib,它使用与另一个相同的命名空间/包名称,你就会受到类加载器的摆布,它通常会选择第一个位置,在那里它可以通过名称找到类。

因此,避免这种情况的最简单方法是使用与 android 上使用的库和版本相同的库和版本,或者将您的库移动到另一个包中。

如果有问题的库允许它(许可证等)并且相当小,那么只需在项目中拉入源文件并让 IDE 执行重构魔法可能会更容易。还有像jarjar这样的工具。

关于 SO (Calling same Method having same packageName From Different JARs, Java, Classpath, Classloading => Multiple Versions of the same jar/project) 有一些问题。所以你也许可以绕过这个问题,但我的直觉是,你最终会陷入大混乱。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多