2016-09-29 16 views
2

私は2つのプロジェクトに取り組んでいます。 1つは小さい(私はこれをProjectAと呼ぶ)一方、もう1つはかなり大きい(ProjectB)。どちらのプロジェクトも同じライブラリ(Photo Editor SDK by IMG.LY)を使用しています。どちらのプロジェクトでも、私はdocumentation for the libraryの簡単な統合手順に従っていました。「ネイティブメソッドの登録に失敗しました」というエラーの原因

ProjectAは画像を表示して選択するのにActivityのカスタムを使用しますが、ProjectBは画像を選択する単純なACTION_PICKの意図を使用します。どちらのプロジェクトも、イメージが選択された後でPhotoEditorActivityを開始するのと同様の方法です。他のUriを受け入れながらProjectAのメソッドを除き、Fileパラメータを受け付けます。

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); 
} 

私はどちらかのプロジェクトで同じ画像を選択した場合は、file.getAbsolutePath()またはuri.getPath()方法は同じStringを返します。例えば:

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

ProjectAは正常に動作し、まだdispatchEditorIntentが呼び出されProjectBに、私は巨大なエラーメッセージと会っています。いくつかの研究私は同様のエラーについての質問に出くわしたが、答えのいずれも該当しなかった後

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) 

... 

:簡潔にするために私は、各エラーとアラート・ログの最初の10行を含みます。私はこれがライブラリの問題ではないと確信していますが、私は1つのプロジェクトで作業していると考えていますが、このエラーの原因を特定できません。

これを引き起こしている可能性のある人は誰でも正しい方向に向けることができますか? @マイクラーレンのコメント

ため

+2

私は「類似の登録に失敗しました私のProguard構成によって引き起こされた「ネイティブ・メソッド」です。私は、基本的にProGuardに、指定したパッケージでは必要ではないと思うクラスやメソッドを捨てないよう伝える '-keep'ステートメントをいくつか追加して修正しました。 ProGuardを使用しているかどうか確認し、そうであれば設定が正しいことを確認してください。 –

+1

また、ProGuardについて... Androidプラグインに同梱されているデフォルトのProGuardルールがバージョン2.2で変更されているため、プロジェクトが同じバージョンのGradleとプラグインで実行されているかどうかを確認してください。 –

+0

うん、それはProGuardだった...それはいつも私がそれを期待していなかったときだ。 RenderScriptには独自のProGuardルールが含まれていると思います。また、私のGradleプラグインは両方のプロジェクトで同じバージョンですが、今後もそれを見守ります。 – Bryan

答えて

3

+1私は前に同様の問題を見てきましたし、修正はProGuardの設定ファイルに次の行を追加することです:

-dontwarn android.support.v8.renderscript.* 
-keepclassmembers class android.support.v8.renderscript.RenderScript { 
    native *** rsn*(...); 
    native *** n*(...); 
} 
関連する問題