"无法注册本机方法"错误的原因?

Bry*_*yan 4 android renderscript

我正在做两个项目; 一个更小(我会称之为ProjectA),而另一个则相当大(ProjectB).两个项目都使用相同的库,即IMG.LYPhoto Editor SDK.对于这两个项目,我遵循了库文档中的简单集成步骤.

ProjectA使用自定义Activity来显示和选择图像,而ProjectB只是使用简单的ACTION_PICK意图来选择图像.两个项目都有类似的方法来PhotoEditorActivity选择图像后启动; 除了ProjectA接受File参数的方法,而另一个接受一个Uri:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果我在任一项目中选择相同的图像,file.getAbsolutePath()或者uri.getPath()方法将返回相同的图像String; 例如:

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

ProjectA工作正常,但在ProjectBdispatchEditorIntent被调用时,我遇到了一个巨大的错误消息.为简洁起见,我只包括每个错误和警报日志的前10行:

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)

...
Run Code Online (Sandbox Code Playgroud)

经过一些研究后,我遇到了类似错误的问题,但没有一个答案是适用的.考虑到我在一个项目中工作,我相当肯定这不是库的问题,但我无法弄清楚导致此错误的原因.

任何人都可以指出我可能导致这种情况的正确方向吗?

Mia*_*ang 9

@Mike Laren的评论+1

我以前见过类似的问题,修复方法是将以下行添加到proguard配置中:

-dontwarn android.support.v8.renderscript.*
-keepclassmembers class android.support.v8.renderscript.RenderScript {
  native *** rsn*(...);
  native *** n*(...);
}
Run Code Online (Sandbox Code Playgroud)