我正在使用一个使用semantics3 api的android应用程序。包含在semantics3库中的是org.json包,它对功能至关重要。使用org.json类和函数的代码都包含在api中,并且可以从android应用程序独立工作。
据我所知,问题是android.jar还包含一个名为org.json的包,但它的功能比semantics3 org.json少。当尝试在应用程序中调用semantics3 api时,我收到以下错误:
05-22 12:06:07.058: W/System.err(6108): java.lang.NoSuchMethodError: org.json.JSONTokener.<init>
05-22 12:06:07.058: W/System.err(6108): at com.semantics3.api.Semantics3Request.fetch(Semantics3Request.java:70)
05-22 12:06:07.058: W/System.err(6108): at com.semantics3.api.Semantics3Request.runQuery(Semantics3Request.java:143)
05-22 12:06:07.058: W/System.err(6108): at com.semantics3.api.Semantics3Request.get(Semantics3Request.java:162)
05-22 12:06:07.058: W/System.err(6108): at com.semantics3.api.Semantics3Request.get(Semantics3Request.java:154)
05-22 12:06:07.058: W/System.err(6108): at com.semantics3.api.Products.getProducts(Products.java:21)
05-22 12:06:07.058: W/System.err(6108): at com.cs194.windowshopping.ProductSearch.findKeywordSearchResults(ProductSearch.java:132)
05-22 12:06:07.058: W/System.err(6108): at com.cs194.windowshopping.ProductSearch.queryByPicture(ProductSearch.java:66)
05-22 12:06:07.058: W/System.err(6108): at com.cs194.windowshopping.ResultsActivity$PopulateResultList.doInBackground(ResultsActivity.java:116)
05-22 12:06:07.058: W/System.err(6108): at com.cs194.windowshopping.ResultsActivity$PopulateResultList.doInBackground(ResultsActivity.java:1)
05-22 12:06:07.058: W/System.err(6108): at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-22 12:06:07.068: W/System.err(6108): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-22 12:06:07.068: W/System.err(6108): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-22 12:06:07.068: W/System.err(6108): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-22 12:06:07.068: W/System.err(6108): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-22 12:06:07.068: W/System.err(6108): at java.lang.Thread.run(Thread.java:841)
我想我的问题是如何确保我的应用程序使用正确的org.json包?或者我如何从android.jar中删除org.json包,以便只存在semantics3.jar中的那个?
答案 0 :(得分:1)
我想我的问题是如何确保我的应用程序使用正确的org.json包?
你没有。固件总是赢。无论你喜欢与否,你都会使用Android的org.json
副本。
欢迎您从第三方JAR中删除org.json
类,并希望他们使用的内容与Android自己的副本兼容。如果没有,请向供应商抱怨他们需要发布与其兼容的Android版本的JAR。
答案 1 :(得分:1)
您可以在GitHub上分叉项目:https://github.com/Semantics3/semantics3-java
该软件已获得MIT许可,因此您可以在语义3中重新打包 org.json(例如将其重命名为org.jsonplus),然后您就不会在Android上遇到任何问题。使用一个好的Java IDE,这只需要一分钟左右。当然,您还必须更改客户端代码以使用新软件包。
答案 2 :(得分:1)
不尝试从android.jar中删除一个类,因为系统中的其他内容可能需要它,例如供应商提供的应用程序。我之前在旧的motorola和htc设备上使用org.json时遇到了同样的问题。
解决方案:
JarJar方法
java -jar jarjar.jar process rulesFile.txt semantics3.jar semantics3-jarjar.jar
rulesFile.txt
rule org.json.@1 rule org.json.jarjar.@1
JarJar https://code.google.com/p/jarjar/wiki/CommandLineDocs
有maven插件可以实现自动化。