"Failed to register native method" 错误的原因?
Cause of "Failed to register native method" error?
我正在做两个项目;一个较小(我称之为 ProjectA
),而另一个相当大(ProjectB
)。这两个项目都使用相同的库,即 Photo Editor SDK by IMG.LY. For both projects I followed the simple integration steps on in the documentation for the library.
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);
}
如果我在任一项目中选择相同的图像,file.getAbsolutePath()
或 uri.getPath()
方法将 return 相同 String
;例如:
/storage/emulated/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)
...
经过一些研究,我遇到了有关类似错误的问题,但 none 的答案是适用的。考虑到我在一个项目中工作,我相当确定这不是库的问题,但我无法弄清楚导致此错误的原因。
任何人都可以指出正确的方向来说明可能导致这种情况的原因吗?
@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 的应用。
我正在做两个项目;一个较小(我称之为 ProjectA
),而另一个相当大(ProjectB
)。这两个项目都使用相同的库,即 Photo Editor SDK by IMG.LY. For both projects I followed the simple integration steps on in the documentation for the library.
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);
}
如果我在任一项目中选择相同的图像,file.getAbsolutePath()
或 uri.getPath()
方法将 return 相同 String
;例如:
/storage/emulated/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)
...
经过一些研究,我遇到了有关类似错误的问题,但 none 的答案是适用的。考虑到我在一个项目中工作,我相当确定这不是库的问题,但我无法弄清楚导致此错误的原因。
任何人都可以指出正确的方向来说明可能导致这种情况的原因吗?
@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 的应用。