使用自定义cordova插件

时间:2017-07-27 06:58:25

标签: android cordova ionic-framework plugins hybrid-mobile-app

我正在开发一个使用自定义API通过USB访问打印机的打印应用程序,所以我需要一个自定义的Cordova插件。我开始开发它,这是一个非常好的挑战,但也非常令人沮丧,因为我无法弄清楚为什么我的插件无法正确使用。 事情是: 1.-插件安装正确,让我构建应用程序 2.- Javascript代码正确运行 3.-我得到一个运行时错误,不会导致应用程序崩溃。好像跳过了Java代码。我注意到Android Monitor出现了错误。

你可以在这里找到我的插件: 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

4 个答案:

答案 0 :(得分:1)

这是堆栈跟踪中最重要的部分:

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.duplou.cordova.plugin.customprinter.CustomPrinter"

您的Cordova配置引用了CustomPrinter插件。当Javascript触发加载时,无法找到Java类,因此应用程序崩溃。

您需要确保应用程序包中存在Java类。

答案 1 :(得分:1)

我看到你指向config.xml中的jar文件。如果你真的想继续使用这个jar文件,请确保路径在android平台文件夹中正确映射,并且它与类路径匹配。

如果你想做一个简单的测试,你应该逐个声明你的android源文件。因此,在节点配置文件之后,您应该添加几个节点,如下所示:

{{1}}

答案 2 :(得分:1)

就我而言,我引用了多个.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。

答案 3 :(得分:0)

我遇到此错误,并通过更改\ platforms \ android \ android.json中的android.json文件来解决了此问题

您必须更改的值 res / xml / config.xml到您的自定义插件包中。

原因是您的自定义插件的包装和上述值不同。