2016-09-29 8 views
2

Ich arbeite an zwei Projekten; Eins ist kleiner (ich nenne das), während das andere ziemlich groß ist (ProjectB). Beide Projekte verwenden dieselbe Bibliothek, die Photo Editor SDK by IMG.LY. Bei beiden Projekten befolgte ich die einfachen Integrationsschritte in der documentation for the library.Ursache des Fehlers "Fehler beim Registrieren der systemeigenen Methode"?

ProjectA verwendet einen benutzerdefinierten Activity anzuzeigen und die Bilder auswählen, während ProjectB nur eine einfache ACTION_PICK Absicht verwendet, ein Bild zu wählen. Beide Projekte haben eine ähnliche Methode, um die PhotoEditorActivity zu starten, nachdem ein Bild ausgewählt wurde; außer das Verfahren in ProjectA akzeptiert einen File Parameter, während der andere ein Uri akzeptiert:

private void dispatchEditorIntent(File file /* Uri uri */) { 
    new PhotoEditorIntent(getActivity()) 
      .setExportDir(PhotoEditorIntent.Directory.PICTURES, getString(R.string.app_name)) 
      .setExportPrefix(Constants.PREFIX_EDITOR) 
      .setSourceImagePath(file.getAbsolutePath()) // uri.getPath() for ProjectB 
      .destroySourceAfterSave(false) 
      .startActivityForResult(REQUEST_EDITOR); 
} 
Wenn ich das gleiche Bild in jedem Projekt wählen, wird das file.getAbsolutePath() oder uri.getPath() Methode die gleiche String zurückkehren; zum Beispiel:

/storage/emulated/0/Pictures/IMG_20160929_145318_395198580.jpeg

ProjectA funktioniert gut, doch in ProjectB wenn dispatchEditorIntent genannt wird, bin ich mit einer gigantischen Fehlermeldung erfüllt. Der Kürze halber enthalten nur die ersten 10 Zeilen jeder den Fehler und Meldungsprotokolle:

09-29 14:53:26.585 4272-4272/com.example.projectb E/art: Failed to register native method android.support.v8.renderscript.RenderScript.nDeviceDestroy(J)V in /data/app/com.example.projectb-1/base.apk 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art: ----- class 'Landroid/support/v8/renderscript/RenderScript;' cl=0x32c34dc0 ----- 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art: objectSize=792 (432 from super) 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art: access=0x8008.0001 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art: super='java.lang.Class<java.lang.Object>' (cl=0x0) 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art: vtable (81 entries, 11 in super): 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art:  0: void android.support.v8.renderscript.RenderScript.finalize() 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art:  1: android.content.Context android.support.v8.renderscript.RenderScript.getApplicationContext() 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art:  2: boolean android.support.v8.renderscript.RenderScript.isAlive() 
09-29 14:53:26.587 4272-4272/com.example.projectb E/art:  3: boolean android.support.v8.renderscript.RenderScript.isUseNative() 

... 

09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchMethodError: no static or non-static method "Landroid/support/v8/renderscript/RenderScript;.nDeviceDestroy(J)V" 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1060) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:975) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1530) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at android.support.v8.renderscript.RenderScript android.support.v8.renderscript.RenderScript.internalCreate(android.content.Context, int, android.support.v8.renderscript.RenderScript$ContextType, int) (RenderScript.java:1385) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at android.support.v8.renderscript.RenderScript android.support.v8.renderscript.RenderScript.create(android.content.Context, int, android.support.v8.renderscript.RenderScript$ContextType, int) (RenderScript.java:1576) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at android.support.v8.renderscript.RenderScript android.support.v8.renderscript.RenderScript.create(android.content.Context, android.support.v8.renderscript.RenderScript$ContextType, int) (RenderScript.java:1526) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at android.support.v8.renderscript.RenderScript android.support.v8.renderscript.RenderScript.create(android.content.Context, android.support.v8.renderscript.RenderScript$ContextType) (RenderScript.java:1502) 
09-29 14:53:26.617 4272-4272/com.example.projectb A/art: art/runtime/java_vm_ext.cc:470] at android.support.v8.renderscript.RenderScript android.support.v8.renderscript.RenderScript.create(android.content.Context) (RenderScript.java:1489) 

... 

Nach einigen Recherchen habe ich über Fragen zu ähnlichen Fehlern kam, aber keine der Antworten waren zutreffend. Ich bin ziemlich sicher, dass dies kein Problem mit der Bibliothek ist, wenn man bedenkt, dass ich es in einem Projekt arbeiten lasse, aber ich kann nicht herausfinden, was diesen Fehler verursacht.

Kann mir jemand in die richtige Richtung zeigen, was das verursacht?

+2

hatte ich ein ähnliches „Fehler registrieren native Methode ", die durch meine Proguard-Konfiguration verursacht wurde. Ich habe es behoben, indem ich ein paar '-halte'-Anweisungen hinzugefügt habe, die ProGuard grundsätzlich anweisen, keine Klassen oder Methoden wegzuwerfen, die in den angegebenen Paketen nicht notwendig sind. Überprüfen Sie, ob Sie ProGuard verwenden und wenn ja, stellen Sie sicher, dass die Konfiguration korrekt ist. –

+1

Auch von ProGuard gesprochen ... die Standard-ProGuard-Regeln, die im Android-Plugin enthalten sind, wurden in Version 2.2 geändert, also prüfen Sie, ob die Projekte mit denselben Versionen von Gradle und Plugins laufen. –

+0

Ja, es war ProGuard ... es ist immer wenn ich es am wenigsten erwarte. Ich habe nichts gefunden, was darauf hindeutet, und Sie würden denken, RenderScript würde seine eigenen ProGuard-Regeln enthalten. Außerdem ist mein Gradle-Plugin für beide Projekte die gleiche Version, aber ich werde in Zukunft darauf achten. – Bryan

Antwort

3

+1 für @ Mike Laren Kommentare

ich vor ähnlichen Problemen gesehen haben, und die Lösung ist, die folgenden Zeilen in der proguard Config hinzuzufügen:

-dontwarn android.support.v8.renderscript.* 
-keepclassmembers class android.support.v8.renderscript.RenderScript { 
    native *** rsn*(...); 
    native *** n*(...); 
} 
Verwandte Themen