java.lang.NoSuchMethodError: org.json.JSONObject.getNames on Android due to conflicting libraries

java.lang.NoSuchMethodError: org.json.JSONObject.getNames on Android due to conflicting libraries

我正在 java 使用 libgdx 创建跨平台应用程序。我在核心项目中使用 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,但给了我同样的错误。

如果您碰巧使用一个库,它使用与另一个库相同的 namespace/package 名称,您将受到 classloader 的支配,它通常会选择第一个位置,它可以按名称查找 class。

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

如果有问题的库允许它(许可证等)并且相当小,您可能更容易将源文件拉入您的项目并让 IDE 进行重构。还有像 jarjar.

这样的工具

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