I am writing a simple Bluetooth 4.0 application which base on Samsung series mobile phone. Android is going to support Bluetooth 4.0 but it does not happen so far. That means I still need using Samsung BLE SDK to use Bluetooth 4.0, that's ok.
When I started learning Samsung BLE SDK via attached samples, it works well. It is build-able under Eclipse, it works. When I used Ant to build the apk (yes, I used to use command-line tool to do developing.), it failed.
I got a run-time error: <A Class> had used a different <B class>; during pre-verification
W/dalvikvm(22070): Class resolved by unexpected DEX: Lcom/samsung/ble/pxpmonitor/ProximityService$3;(0x430e85d0):0x40086000 ref [Lcom/samsung/android/sdk/bt/gatt/BluetoothGattCallback;] Lcom/samsung/android/sdk/bt/gatt/BluetoothGattCallback;(0x430e85d0):0x40038000 W/dalvikvm(22070): (Lcom/samsung/ble/pxpmonitor/ProximityService$3; had used a different Lcom/samsung/android/sdk/bt/gatt/BluetoothGattCallback; during pre-verification) W/dalvikvm(22070): Unable to resolve superclass of Lcom/samsung/ble/pxpmonitor/ProximityService$3; (60) W/dalvikvm(22070): Link of class 'Lcom/samsung/ble/pxpmonitor/ProximityService$3;' failed D/AndroidRuntime(22070): Shutting down VM W/dalvikvm(22070): threadid=1: thread exiting with uncaught exception (group=0x41f83930) E/AndroidRuntime(22070): FATAL EXCEPTION: main E/AndroidRuntime(22070): java.lang.NoClassDefFoundError: com/samsung/ble/pxpmonitor/ProximityService$3 E/AndroidRuntime(22070): at com.samsung.ble.pxpmonitor.ProximityService.(ProximityService.java:195) E/AndroidRuntime(22070): at java.lang.Class.newInstanceImpl(Native Method) .....(skip) E/AndroidRuntime(22070): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
Because the apk file I built contains ble_sdk.jar, and Samsung Galaxy S4 has the same (at least, the same name) implementation under /system/framework.
The problem is that I have to build some classes which depend on ble_sdk.jar, but I cannot package the ble_sdk.jar into apk file since it makes duplication.
In general, we put dependency libraries to directory libs, but the dex-helper macro in Android Ant build system merges EVERY JAR FILES INTO classes.dex. Cool, that bites me.
To put the ble_sdk.jar outside directory libs and asks ant-building-system refer to it? it doesn't work, we even cannot override the property jar.libs.dir. (issue #33194)
I tried to figure it out but quit with no luck. If you know a good way match my requirement, please tell me. This is my workaround. (workaround means --- Someday I will bite myself.)
Workaround: Do not package each jar under libs unless I ask you to do that.
Add a custom_rules.xml to your project with these statements.
<project> <target name="-post-compile"> <path id="project.all.jars.path"> <!-- un-comment below line if you want it--> <!-- <pathelement path="libs/please_package_this.jar"> --> </path> <echo level="info">To be packaged jar: ${toString:project.all.jars.path} </project>
It cleans project.all.jars.path that defines Android ant-building-system's merge targets. I don't like this idea but it basically works.