IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utiliser un jar embarqué plutôt qu'un jar système


Sujet :

Android

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut Utiliser un jar embarqué plutôt qu'un jar système
    Bonjour,

    Je travaille actuellement sur un projet pour une flasheuse Zebra TC800, un lecteur de code barre connecté tournant sous Android. Ces lecteurs fonctionnent sous Android, et le développement d'applications se fait sous Android Studio. Le développement se fait comme sur smartphone, et une librairie en Java, EMDK, permet de lire les codes barre.

    Les premières versions de l'application fonctionnaient bien, jusqu'à ce que j'essaye de modifier le paramètre aimType de la configuration du scanner. (Il permet, entre autre, de demander à ne prendre en compte un code barre qu'après que l'utilisateur l'ai pointé pendant un délai minimum, pour éviter les erreurs de saisie, mais ce n'est pas important pour comprendre le problème.) Le code compile sans problème, mais à l'exécution, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.NoSuchFieldError: No instance field aimType of type Lcom/symbol/emdk/barcode/ScannerConfig$AimType; in class Lcom/symbol/emdk/barcode/ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific; or its superclasses (declaration of 'com.symbol.emdk.barcode.ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific' appears in /system/framework/com.symbol.emdk.jar)
    A en croire ce message, le champ aimType de la configuration n'existe pas, alors qu'Android Studio confirme son existence. J'ai décompilé l'apk et la classe ScannerConfig.ReaderParams.ReaderSpecific.LaserSpecific s'y trouve bien, et elle a un champ aimType. En revanche, si j'utilise l'introspection de code ( getClass().getDeclaredFields() ) , LaserSpecific n'a pas de champ aimType à l'exécution.

    J'ai vérifié la documentation, et aimType est un ajout récent à cette librairie, les versions précédentes ne l'ont pas. A ce stade, je soupçonne que l'application ignore la copie d'EMDK embarquée dans mon apk au profit d'un version plus ancienne pré existant sur le lecteur de code barre, sans pouvoir le confirmer.

    A toutes fins utiles, voici le code que j'utilise pour accéder au champ aimType:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ScannerConfig config = scanner.getConfig();
    ScannerConfig.AimType aimType =  ScannerConfig.AimType.TIMED_HOLD;
    config.readerParams.readerSpecific.laserSpecific.aimType = aimType;
    config.readerParams.readerSpecific.laserSpecific.aimTimer = 500;
    scanner.setConfig(config);

    Ici, le fichier build.gradle indiquant l'utilisation d'EMDK:
    Code Groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    apply plugin: 'com.android.application'
     
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "com.bonduelle.agreoscan.agreoscan"
            minSdkVersion 22
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        productFlavors {
            emdk6 {
                targetSdkVersion 23
                minSdkVersion 21 // EMDK 6.0 supports as far back as KitKat (19)
                versionCode 30000 + android.defaultConfig.versionCode
                versionNameSuffix "-emdk6"
            }
            emdk5 {
                // Not compatible with Marshmallow devices
                minSdkVersion 16
                targetSdkVersion 16 // Though EMDK 5 actually supported up to Lollipop, we are only using it for JB deployments
                maxSdkVersion 22 // Note: Google would still allow installation on 23+ devices (https://developer.android.com/guide/topics/manifest/uses-sdk-element.html)
                versionCode 75000 + android.defaultConfig.versionCode
                versionNameSuffix "-emdk5"
            }
        }
    }
     
    dependencies {
        provided fileTree(include: ['com.symbol.emdk.jar'], dir: 'D:\\Andoid\\sdk\\add-ons\\addon-symbol_emdk-symbol-23\\libs')
        compile fileTree(exclude: ['com.symbol.emdk.jar'], dir: 'libs')
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        compile 'com.mcxiaoke.volley:library:1.0.19'
        testCompile 'junit:junit:4.12'
    }
    J'ai essayé de mettre la dépendance EMDK en compile, sans changement.

    Quelqu'un a-t-il déjà eu un problème similaire, où la version d'une dépendance changeait entre l'environnement de développement et l'exécution? A moins que ce ne soit un autre problème entièrement?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    J'ai posé la question sur le forum du constructeur, où j'ai eu la solution. Je la transcris ici au cas où quelqu'un d'autre serait intéressé.

    La logique de la lecture du code barre se trouve sur le lecteur lui-même. Par conséquent, on ne peut pas forcer la librairie à utiliser une version incluse dans le jar. La seule solution est de mettre à jour le système d'exploitation. La mise à jour disponible sur le site du constructeur dispose de la dernière version.

    Merci à tous ceux qui m'ont lu pour m'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser le lanceur Java pour un fichier Jar depuis une application ?
    Par Baptiste Wicht dans le forum Général Java
    Réponses: 5
    Dernier message: 10/02/2010, 09h41
  2. Utilisation d'un seul package d'un JAR
    Par ziad.shady dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 14/04/2009, 12h08
  3. [StAX] Probleme a l'utilisation de stax a cause de rt.jar
    Par progamer54 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 27/11/2007, 11h32
  4. [JAR] probleme d'exec de JAR faisant appel à un autre JAR
    Par guis14 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/01/2006, 09h19
  5. [JAR][POLICE] Utiliser une police ttf dans un fichier jar
    Par Doc.Fusion dans le forum Général Java
    Réponses: 3
    Dernier message: 26/01/2005, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo