使用自定义cordova插件找不到类异常
Posted
技术标签:
【中文标题】使用自定义cordova插件找不到类异常【英文标题】:Class Not Found Exception using custom cordova plugin 【发布时间】:2018-01-02 18:00:49 【问题描述】:我正在开发一个使用自定义 API 通过 USB 访问打印机的打印应用程序,因此我需要一个自定义 Cordova 插件。我开始开发它,这是一个很好的挑战,但现在也很令人沮丧,因为我不知道为什么我的插件不能正确使用。 事情是: 1.- 插件正确安装并让我构建应用程序 2.- javascript 代码正确运行 3.- 我得到一个运行时错误,它不会使应用程序崩溃。似乎跳过了 Java 代码。我注意到 android 监视器中有一个错误。
你可以在这里找到我的插件: https://github.com/krlozadan/cordova-custom-printer-plugin
W/System.err: java.lang.ClassNotFoundException: com.duplou.cordova.plugin.customprinter.CustomPrinter
W/System.err: at java.lang.Class.classForName(Native Method)
W/System.err: at java.lang.Class.forName(Class.java:324)
W/System.err: at java.lang.Class.forName(Class.java:285)
W/System.err: at org.apache.cordova.PluginManager.instantiatePlugin(PluginManager.java:489)
W/System.err: at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:169)
W/System.err: at org.apache.cordova.PluginManager.exec(PluginManager.java:122)
W/System.err: at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:57)
W/System.err: at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
W/System.err: at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
W/System.err: at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61)
W/System.err: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.duplou.cordova.plugin.customprinter.CustomPrinter" on path: DexPathList[[zip file "/data/app/1/lib/1/base.apk!/lib/x86, /vendor/lib, /system/lib]]
W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
W/System.err: ... 13 more
W/System.err: Suppressed: java.lang.ClassNotFoundException: com.duplou.cordova.plugin.customprinter.CustomPrinter
W/System.err: at java.lang.Class.classForName(Native Method)
W/System.err: at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
W/System.err: at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
W/System.err: ... 14 more
W/System.err: Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
I/System.out: Error adding plugin com.duplou.cordova.plugin.customprinter.CustomPrinter.
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.apache.cordova.CordovaPlugin.privateInitialize(java.lang.String, org.apache.cordova.CordovaInterface, org.apache.cordova.CordovaWebView, org.apache.cordova.CordovaPreferences)' on a null object reference
W/System.err: at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171)
W/System.err: at org.apache.cordova.PluginManager.exec(PluginManager.java:122)
W/System.err: at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:57)
W/System.err: at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
W/System.err: at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
W/System.err: at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61)
D/SystemWebChromeClient: file:///android_asset/www/plugins/cordova-custom-printer-plugin/www/custom-printer.js: Line 11 : Se terminó la ejecución
I/chromium: [INFO:CONSOLE(11)] "Se terminó la ejecución", source: file:///android_asset/www/plugins/cordova-custom-printer-plugin/www/custom-printer.js (11)
D/CordovaWebViewImpl: onPageFinished(file:///android_asset/www/index.html)
W/PluginManager: THREAD WARNING: exec() call to Sim.getSimInfo blocked the main thread for 53ms. Plugin should use CordovaInterface.getThreadPool().
D/SystemWebChromeClient: file:///android_asset/www/build/main.js: Line 1436 : ERROR
I/chromium: [INFO:CONSOLE(1436)] "ERROR", source: file:///android_asset/www/build/main.js (1436)
W/BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 12139
D/EGL_emulation: eglMakeCurrent: 0xae414a40: ver 2 0 (tinfo 0xa14bfbe0)
Here's my ionic info output
global packages:
@ionic/cli-utils : 1.5.0
Cordova CLI : 7.0.1
Ionic CLI : 3.5.0
local packages:
@ionic/app-scripts : 1.3.7
@ionic/cli-plugin-cordova : 1.4.1
@ionic/cli-plugin-ionic-angular : 1.3.2
Cordova Platforms : android 6.2.3
Ionic Framework : ionic-angular 3.2.1
System:
Node : v6.10.3
OS : macOS Sierra
Xcode : Xcode 8.3.2 Build version 8E2002
ios-deploy : not installed
ios-sim : not installed
npm : 3.10.10
【问题讨论】:
你对蓝牙打印机做过同样的事情吗? 不,我没有,这是我第一次开发 Cordova 插件,实际上,就在昨天,我得到了它与客户要求的所有功能一起工作 :) 为什么?我能有点用吗? 是的,实际上我想从 starIO 打印机的本机 ios sdk 构建自定义插件,有一个 GitHub,但对 ionic1 不起作用,所以对我不起作用。跨度> 好的,如果你喜欢我们可以通过 github 讨论它,只需创建你的 repo 并分享你的 URL 请在此处找到 repo github.com/Abhishek134/StarIO 【参考方案1】:我看到您指向 config.xml 中的一个 jar 文件。如果你真的想继续使用这个 jar 文件,请确保该路径在 android 平台文件夹中正确映射并且它与类路径匹配。
如果你想做一个简单的测试,你应该一个一个声明你的android源文件。因此,在节点配置文件之后,您应该添加几个像这样的节点:
<source-file src="src/android/src/net/mydomain/myplugin/MyClass.java" target-dir="src/mydomain/myplugin" />
【讨论】:
谢谢!在您的帮助下,我发现了我的错误,原来我的源文件标签输入错误。所以 Cordova CLI 不会告诉我我有这个问题,我一直在到处搜索!【参考方案2】:这是堆栈跟踪中最重要的部分:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.duplou.cordova.plugin.customprinter.CustomPrinter"
您的 Cordova 配置引用了 CustomPrinter
插件。当 Javascript 触发加载它时,找不到 Java 类,因此您的应用程序崩溃。
您需要确保 Java 类存在于您的应用程序包中。
【讨论】:
这是我的 plugin.xml 文件配置行<config-file target="res/xml/config.xml" parent="/*"> <feature name="CustomPrinter"> <param name="android-package" value="com.duplou.cordova.plugin.customprinter.CustomPrinter" /> </feature> </config-file>
那是指Java类的javascript部分。问题是当你的应用程序被加载时,Java 类不在你的运行时路径上。【参考方案3】:
我有这个错误并通过更改 \platforms\android\android.json 中的 android.json 文件解决了它
您必须更改 res/xml/config.xml 到您的自定义插件包。
原因是你的自定义插件的包和上面的值不一样。
【讨论】:
【参考方案4】:在我的例子中,我引用了多个 .java 文件。当我更改它在 plugin.xml 中的引用顺序时,它解决了问题。似乎最后一个 .java 文件依赖于倒数第二个。
之前:
<!--libs-->
<source-file src="libs/sample-release.aar" target-dir="libs/" />
<source-file src="src/android/Licence.java" target-dir="src/android/" />
<source-file src="src/android/Deserializer.java" target-dir="src/android/" />
之后:
<!--libs-->
<source-file src="libs/sample-release.aar" target-dir="libs/" />
<source-file src="src/android/Deserializer.java" target-dir="src/android/" />
<source-file src="src/android/Licence.java" target-dir="src/android/" />
所以只要切换顺序,ClassNotFoundException 就解决了。
【讨论】:
以上是关于使用自定义cordova插件找不到类异常的主要内容,如果未能解决你的问题,请参考以下文章
在自定义类下拉菜单 Xcode 8.3.2 中找不到自定义控制器类
使用Android studio创建的AIDL编译时找不到自定义类的解决办法