私は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つのプロジェクトで作業していると考えていますが、このエラーの原因を特定できません。
これを引き起こしている可能性のある人は誰でも正しい方向に向けることができますか? @マイクラーレンのコメント
ため
私は「類似の登録に失敗しました私のProguard構成によって引き起こされた「ネイティブ・メソッド」です。私は、基本的にProGuardに、指定したパッケージでは必要ではないと思うクラスやメソッドを捨てないよう伝える '-keep'ステートメントをいくつか追加して修正しました。 ProGuardを使用しているかどうか確認し、そうであれば設定が正しいことを確認してください。 –
また、ProGuardについて... Androidプラグインに同梱されているデフォルトのProGuardルールがバージョン2.2で変更されているため、プロジェクトが同じバージョンのGradleとプラグインで実行されているかどうかを確認してください。 –
うん、それはProGuardだった...それはいつも私がそれを期待していなかったときだ。 RenderScriptには独自のProGuardルールが含まれていると思います。また、私のGradleプラグインは両方のプロジェクトで同じバージョンですが、今後もそれを見守ります。 – Bryan