Raphael Royer-Rivard
Raphael Royer-Rivard

Reputation: 2252

Android cordova plugin : NoClassDefFoundError

My project is a Meteor application that has web users and mobile users (on Android and iOS). The reason why I need to have native applications with Cordova is because I need to use a specific library (that have been coded for Android and iOS). I've developped a cordova-plugin that is a bridge between my Meteor app and my library. I add this cordova-plugin with the command meteor add cordova:{plugin_name@bitbucket_url/get/commit_hash.tar.gz} . And then I run my app with meteor run android-device --verbose to build it on my Nexus 5.

When I look at the logs, I see no error, I also see that my jar files needed in my plugin are dexed:

-dex:
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/ant-build/classes
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/CordovaLib/ant-build/classes.jar
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/com.google.playservices/google-play-services_lib/ant-build/classes.jar
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/anywaresdk.jar
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/android-async-http-1.4.4.jar
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/com.google.playservices/google-play-services_lib/libs/google-play-services.jar
      [dex] input: /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/android-beacon-library-2.0.jar
      [dex] Using Pre-Dexed classes-08b5b91946ca0289c8a6c6185a42d50c.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/CordovaLib/ant-build/classes.jar
      [dex] Using Pre-Dexed classes-df56033b7c34d81e6100d180a5eb093f.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/com.google.playservices/google-play-services_lib/ant-build/classes.jar
      [dex] Using Pre-Dexed anywaresdk-ebcd8e8b201f2cf0e8f3947837f0a238.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/anywaresdk.jar
      [dex] Using Pre-Dexed android-async-http-1.4.4-1381083dec2d5e09b669d0f4d8aa7dbb.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/android-async-http-1.4.4.jar
      [dex] Using Pre-Dexed google-play-services-63680b630aa52e827ce265766636b8d0.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/com.google.playservices/google-play-services_lib/libs/google-play-services.jar
      [dex] Using Pre-Dexed android-beacon-library-2.0-b9ed313a0085ed5333e28cb89c1128cf.jar <- /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/libs/android-beacon-library-2.0.jar
      [dex] Found modified input file
      [dex] Converting compiled files and external libraries into /home/raphael/WebstormProjects/skyshow/.meteor/local/cordova-build/platforms/android/ant-build/classes.dex...
       [dx] Merged dex A (85 defs/107.7KiB) with dex B (207 defs/313.5KiB). Result is 292 defs/511.4KiB. Took 0.3s
       [dx] Merged dex A (292 defs/511.4KiB) with dex B (1 defs/0.4KiB). Result is 293 defs/652.5KiB. Took 0.1s
       [dx] Merged dex A (293 defs/652.5KiB) with dex B (72 defs/146.9KiB). Result is 365 defs/1077.0KiB. Took 0.1s
       [dx] Result compacted from 1634.2KiB to 597.6KiB to save 1036.6KiB
       [dx] Merged dex A (365 defs/1077.0KiB) with dex B (40 defs/59.6KiB). Result is 405 defs/597.6KiB. Took 0.2s
       [dx] Merged dex A (405 defs/597.6KiB) with dex B (3422 defs/3053.3KiB). Result is 3827 defs/4345.6KiB. Took 0.4s
       [dx] Result compacted from 5460.2KiB to 3712.5KiB to save 1747.7KiB
       [dx] Merged dex A (3827 defs/4345.6KiB) with dex B (67 defs/95.6KiB). Result is 3894 defs/3712.5KiB. Took 0.6s

But when my app starts after the build, after several seconds of execution I get the following error:

I/art     (18645): Rejecting re-init on previously-failed class java.lang.Class<novom.anyware.anywaresdk.AWRAlarmBroadcastReceiver>
I/art     (18645): Rejecting re-init on previously-failed class java.lang.Class<novom.anyware.anywaresdk.AWRAlarmBroadcastReceiver>
D/AndroidRuntime(18645): Shutting down VM
--------- beginning of crash
E/AndroidRuntime(18645): FATAL EXCEPTION: main
E/AndroidRuntime(18645): Process: com.id1yih4vymtz45gm5gsdh, PID: 18645
E/AndroidRuntime(18645): java.lang.NoClassDefFoundError: Failed resolution of: Lnovom/anyware/anywaresdk/AWRAlarmBroadcastReceiver;
E/AndroidRuntime(18645):    at novom.anyware.anywaresdk.AWRUtils.cancelAlarm(AWRUtils.java:270)
E/AndroidRuntime(18645):    at novom.anyware.anywaresdk.AWRSyncService.stopPushService(AWRSyncService.java:413)
E/AndroidRuntime(18645):    at novom.anyware.anywaresdk.AWRSyncService.onDestroy(AWRSyncService.java:420)
E/AndroidRuntime(18645):    at android.app.ActivityThread.handleStopService(ActivityThread.java:2894)
E/AndroidRuntime(18645):    at android.app.ActivityThread.access$2200(ActivityThread.java:144)
E/AndroidRuntime(18645):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381)
E/AndroidRuntime(18645):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(18645):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(18645):    at android.app.ActivityThread.main(ActivityThread.java:5221)
E/AndroidRuntime(18645):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(18645):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(18645):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
E/AndroidRuntime(18645):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
E/AndroidRuntime(18645): Caused by: java.lang.ClassNotFoundException: Didn't find class "novom.anyware.anywaresdk.AWRAlarmBroadcastReceiver" on path: DexPathList[[zip file "/data/app/com.id1yih4vymtz45gm5gsdh-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
E/AndroidRuntime(18645):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(18645):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(18645):    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/AndroidRuntime(18645):    ... 13 more
E/AndroidRuntime(18645):    Suppressed: java.lang.NoClassDefFoundError: novom.anyware.anywaresdk.AWRAlarmBroadcastReceiver
E/AndroidRuntime(18645):        at dalvik.system.DexFile.defineClassNative(Native Method)
E/AndroidRuntime(18645):        at dalvik.system.DexFile.defineClass(DexFile.java:226)
E/AndroidRuntime(18645):        at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
E/AndroidRuntime(18645):        at dalvik.system.DexPathList.findClass(DexPathList.java:321)
E/AndroidRuntime(18645):        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
E/AndroidRuntime(18645):        ... 15 more
E/AndroidRuntime(18645):    Suppressed: java.lang.ClassNotFoundException: novom.anyware.anywaresdk.AWRAlarmBroadcastReceiver
E/AndroidRuntime(18645):        at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(18645):        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
E/AndroidRuntime(18645):        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
E/AndroidRuntime(18645):        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(18645):        ... 14 more
E/AndroidRuntime(18645):    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

I can see some logs that let me know that most of the classes in the anywaresdk.jar file are used successfuly before the error occurs with the AWRAlarmBroadcastReceiver. Just to make sure that the file was present, I unziped the jar file and I found the class file that is supposedly missing...

I also copied the apk that was installed in my Nexus 5 by meteor, unziped it and outputed the content of the file classes.dex with the android build tool dexdump and the class Lnovom/anyware/anywaresdk/AWRAlarmBroadcastReceiver; was listed in it.

Just to be sure my jar files were not corruped or something, I used them in a native Android app and they worked like supposed.

Why do I get a NoClassDefFoundError when I use them in my Meteor app via my Cordova plugin?

Upvotes: 2

Views: 1523

Answers (1)

Raphael Royer-Rivard
Raphael Royer-Rivard

Reputation: 2252

For anyone that has a similar issue, my problem was that this file had a dependency to support-v4 and I was not including it as a dependency in the plugin.xml of my cordova plugin. Thanks to Chris Stratton on that post NoClassDefFoundError at runtime but class is in classes.dex, what givies?

Upvotes: 1

Related Questions