Android “原因”;未能注册本机方法";错误?

Android “原因”;未能注册本机方法";错误?,android,renderscript,Android,Renderscript,我正在做两个项目;一个较小(我称之为ProjectA),而另一个相当大(ProjectB)。这两个项目都使用相同的库。对于这两个项目,我都遵循了中的简单集成步骤 ProjectA使用自定义的活动来显示和拾取图像,而ProjectB仅使用简单的操作_pick来选择图像。两个项目都有相似的方法在选择图像后启动Photoeditor活动;除了ProjectA中的方法外,另一个方法接受文件参数,而另一个方法接受Uri: private void dispatchEditorIntent(File fil

我正在做两个项目;一个较小(我称之为
ProjectA
),而另一个相当大(
ProjectB
)。这两个项目都使用相同的库。对于这两个项目,我都遵循了中的简单集成步骤

ProjectA
使用自定义的
活动
来显示和拾取图像,而
ProjectB
仅使用简单的
操作_pick
来选择图像。两个项目都有相似的方法在选择图像后启动
Photoeditor活动
;除了
ProjectA
中的方法外,另一个方法接受
文件
参数,而另一个方法接受
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);
}
如果我在任一项目中选择相同的图像,则
文件.getAbsolutePath()
uri.getPath()
方法将返回相同的
字符串
;例如:

/存储/模拟/0/Pictures/IMG_20160929_145318_395198580.jpeg

ProjectA
工作正常,但在
ProjectB
中调用
dispatchEditorIntent
时,我会收到一条巨大的错误消息。为简洁起见,我仅包括错误和警报日志中每个日志的前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)

...
09-29 14:53:26.585 4272-4272/com.example.projectb E/art:未能在/data/app/com.example.projectb-1/base.apk中注册本机方法android.support.v8.renderscript.renderscript.nDeviceDestroy(J)V
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(来自super的432)
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'(cl=0x0)
09-29 14:53:26.587 4272-4272/com.example.projectb E/art:vtable(81个条目,11个超级条目):
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在应用程序中检测到错误:JNI NewGlobalRef调用时出现挂起的异常java.lang.NoSuchMethodError:没有静态或非静态方法“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]位于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]位于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]位于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]位于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]在android.support.v8.renderscript.renderscript.android.support.v8.renderscript.renderscript.renderscript.internalCreate(android.content.Context,int,android.support.v8.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]在android.support.v8.renderscript.renderscript.android.support.v8.renderscript.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]位于android.support.v8.renderscript.renderscript.android.support.v8.renderscript.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]位于android.support.v8.renderscript.renderscript.android.support.v8.renderscript.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]位于android.support.v8.renderscript.renderscript.android.support.v8.renderscript.renderscript.create(android.content.Context)(renderscript.java:1489)
...
经过一些研究,我遇到了关于类似错误的问题,但没有一个答案是适用的。考虑到我在一个项目中使用该库,我相当肯定这不是一个问题,但我无法找出导致此错误的原因


有人能告诉我是什么导致了这一切吗

@Mike Laren的评论+1

我以前见过类似的问题,解决方法是在proguard配置中添加以下行:

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

今天我遇到了这个问题,因为我使用的是Android X,所以我不得不在我的
proguard rules.pro
文件中添加以下内容

# Render Script
-keep class android.support.v8.renderscript.** { *; }
-keep class androidx.renderscript.** { *; }
这将解决使用Android支持库以及Android X的应用程序。

我有一个类似的“注册本机方法失败”,这是由我的Proguard配置引起的。我通过添加几个
-keep
语句来修复它,这些语句基本上告诉ProGuard不要丢弃任何cla