2017-05-15 1 views
2

Je suis en essayant de charger des bibliothèques natives c dans mon application Andoid, et j'obtiens l'erreur suivante:JNI DETECTEE ERREUR DANS L'APPLICATION: JNI NewGlobalRef appelé à l'attente exception java.lang.NoSuchFieldError

JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchFieldError: no "I" field "mNativePtr" in class "Landroid/os/Parcel;" or its superclasses

Voici une partie du message logcat:

05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchFieldError: no "I" field "mNativePtr" in class "Landroid/os/Parcel;" or its superclasses 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:435) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:370) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1076) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void fr.limsi.registration.utils.NativeInterface.<clinit>() (NativeInterface.java:12) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void fr.limsi.registration.utils.NativeInterface.tangoInitServices() (NativeInterface.java:-2) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void fr.limsi.registration.activities.ProjectViewActivity.onStart() (ProjectViewActivity.java:63) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void android.app.Instrumentation.callActivityOnStart(android.app.Activity) (Instrumentation.java:1238) 
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] at void android.app.Activity.performStart() (Activity.java:6302) 

J'interprète cela comme:

The class android.od.Parcel doesn't have any field called "mNativePtr".

J'utilise une tablette Lenovo PHAB II, fonctionnant avec Abdroid 6.0, et la machine virtuelle d'art. C'est la première fois que j'ai ce problème lors de l'exécution de code natif sur Android, et je ne comprends pas pourquoi je reçois ce message. Cela se produit lorsque l'application effectue un appel à System.loadLibrary() et que l'application se bloque avant d'exécuter mon code natif. Est-ce que quelqu'un a une idée?

Merci beaucoup!

P.S: Je proguard est désactivé

+0

Regardons simplement [ce] (http://stackoverflow.com/questions/34891686/android-jni-detected-error-in-application -jni-getmethodid-called-with-pending-e) –

+0

Le problème se produit lorsque j'essaie de charger une bibliothèque, pas quand je l'utilise. il semble que c'est le code exécuté par System.loadLibrary() qui échoue lors de la recherche du mNativePtr, mais il n'y a pas de raison du tout. – aarnaud

Répondre

0

Android a changé sa mise en œuvre interne de la classe android.os.Parcel de la version 4.0 vers 4.1.

Dans la version 4.1.1 il y a:

@SuppressWarnings({"UnusedDeclaration"}) 
private int mNativePtr; // used by native code 
/** 
* Flag indicating if {@link #mNativePtr} was allocated by this object, 
* indicating that we're responsible for its lifecycle. 
*/ 
private boolean mOwnsNativeParcelObject; 

Dans la version 4.0.4 il y avait:

@SuppressWarnings({"UnusedDeclaration"}) 
private int mObject; // used by native code 
@SuppressWarnings({"UnusedDeclaration"}) 
private int mOwnObject; // used by native code 

Il semble que vos autres bibliothèques natives C sont compatibles avec Android 4.1, mais pas à Android 4.0.

+0

Je compile avec la plate-forme API 23 Android. La classe Parcel contient le champ mNativePtr, mais n'est pas utilisée par le code Java. Peut-être que ce champ est automatiquement supprimé pendant la construction. – aarnaud

2

J'ai rencontré ce problème avec les bibliothèques Google Tango, mais je n'ai pas trouvé de solution. Désolé, je n'ai pas encore assez de karma pour commenter.

Étant donné que vous utilisez un appareil Google Tango, je suppose que votre problème est le même que le mien. Quelque chose avec Google Tango.

modifier:

l'a résolu. Nécessaire pour charger le tango_client_api.so d'abord, avant de charger toute autre chose:

public class MainActivity extends AppCompatActivity { 

// Used to load the 'native-lib' library on application startup. 
static { 
    // This project depends on tango_client_api, so we need to make sure we load 
    // the correct library first. 
    if (com.projecttango.examples.cpp.util.TangoInitializationHelper.loadTangoSharedLibrary() == 
      com.projecttango.examples.cpp.util.TangoInitializationHelper.ARCH_ERROR) { 
     Log.e("TangoJNINative", "ERROR! Unable to load libtango_client_api.so!"); 
    } 
    System.loadLibrary("native-lib"); 
}