【问题标题】:Renderscript broken with AndroidX?AndroidX 破坏了渲染脚本?
【发布时间】:2018-10-12 14:35:10
【问题描述】:

自从我迁移到 androidx 后,我无法让 Renderscript 运行。我收到以下异常:

2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 应用程序中检测到 JNI 错误:JNI 以挂起的异常调用 NewGlobalRef java.lang.ClassNotFoundException:找不到类 路径上的“android.support.v8.renderscript.RenderScript”: DexPathList[[压缩文件 "/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk"],nativeLibraryDirectories=[/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/lib/arm64, /data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk!/lib/arm64-v8a, /system/lib64,/system/vendor/lib64]] 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 java.lang.类 dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, 布尔值)(ClassLoader.java:379)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1099) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在无效 java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:1014) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在无效 java.lang.System.loadLibrary(java.lang.String) (System.java:1657) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 androidx.renderscript.RenderScript androidx.renderscript.RenderScript.internalCreate(android.content.Context, int, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1408) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, int, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1599) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1549) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, androidx.renderscript.RenderScript$ContextType) (RenderScript.java:1525) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] 在 androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context) (RenderScript.java:1512)

我在 gradle 中有通常的条目:

    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true

还有什么需要改变的吗?

【问题讨论】:

  • 我也遇到了 renderscript 的问题......它使我的应用程序崩溃,并在 API21 之前发出致命信号 11

标签: android renderscript android-renderscript


【解决方案1】:

我有同样的问题,我切换到不支持的渲染脚本版本

在项目分级中

renderscriptTargetApi 17
renderscriptSupportModeEnabled false

并且在使用渲染脚本的类中

import android.renderscript.RenderScript

而不是

import androidx.renderscript.RenderScript

它为我完成了这项工作,但我不喜欢这个解决方案,待完成

【讨论】:

  • 这也为我解决了这个问题,它之前在 API 21 上崩溃了。尽管我认为 renderscriptTargetApi 至少可以与您的 minSdkVersion 相同。
  • 奇怪!似乎只被 AndroidX 破坏了。与旧支持库一起工作就像一个魅力
  • 关闭 renderscriptSupportMode 会错过什么?
  • 伙计们,我发现了这个问题。似乎从支持库 (android.support.v8.renderscript) 更改为常规渲染脚本库 (android.renderscript.RenderScript) 会删除 64 位兼容性。这意味着您的应用将在 8 月 1 日之前在 64 位手机的 Playstore 上不再受支持。有人找到解决方案了吗???
  • @Zee 看来您需要将您的 renderscriptTargetApi 提升到 21 或更高版本才能获得 64 位支持 - developer.android.com/distribute/best-practices/develop/…
【解决方案2】:

构建工具(准确地说是预构建的 librsjni_androidx.so)存在问题,现已在 29.0.2 版本中得到修复。

我已通过将 compile sdk 升级到 API 29 并将构建工具升级到 29.0.2 来验证这一点。

编辑: 这是我在build.gradle中配置的:

    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true

【讨论】:

  • 你的默认配置是什么样的?你在使用 renderscriptTargetApi 21 renderscriptSupportModeEnabled true 吗?
  • @dtunctuncer 嘿,我已经编辑了答案以将我的配置包含在 build.gradle 中:renderscriptTargetApi 18 renderscriptSupportModeEnabled true
  • 谢谢,我会试试的,希望它不会带来新的崩溃 :)
【解决方案3】:

我可以通过将buildToolsVersion 的版本更改为29.0.2renderscriptTargetApi 的版本为29 来解决问题:

android {
    // ...
    buildToolsVersion '29.0.2'
    defaultConfig {
        // ...
        renderscriptTargetApi 29
        renderscriptSupportModeEnabled true
    }
    // ...
}

【讨论】:

  • 耶!这工作:) 也检查过,它不会导致 64 位问题。
  • 等等,它仍然在 Android 6 上崩溃 :( 叹息。真的有人对此有解决方案吗?
  • 就我而言,无需将renderscriptTargetApi 更新为 29。我已将其设置为 19,而我使用 21 的 RS 功能。更新 buildToolsVersion 并更新 pro-guard 规则对我有用。
【解决方案4】:

在我的 gradle 模块文件中:

renderscriptTargetApi 19
renderscriptSupportModeEnabled true

而且,在迁移到 AndroidX 之前,我进行了以下导入:

import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.Matrix4f;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.support.v8.renderscript.ScriptIntrinsicColorMatrix;
import android.support.v8.renderscript.ScriptIntrinsicConvolve3x3;

迁移到 AndroidX 后,就像文档说的那样:

我在我的 gradle 模块文件中保留了相同的语句,但我升级到 buildToolsVersion 29.0.2 和我的 compileSdkVersion 到 28

我将以前的导入更改为以下,一切正常。

import androidx.renderscript.Matrix4f;
import androidx.renderscript.RenderScript;
import androidx.renderscript.Allocation;
import androidx.renderscript.Element;
import androidx.renderscript.ScriptIntrinsicBlur;
import androidx.renderscript.ScriptIntrinsicColorMatrix;
import androidx.renderscript.ScriptIntrinsicConvolve3x3;

【讨论】:

    【解决方案5】:

    我通过添加 proguard 来修复: 我得到了谷歌支持者here的回答

    -keepclasseswithmembernames,includedescriptorclasses class * {
    native <methods>;
    }
    # RenderScript to be safe on "native callback" side
    -keep class androidx.renderscript.** { *; }
    

    【讨论】:

      【解决方案6】:

      标记的答案确实使它工作,但正如@Zee 提到的,似乎不支持的常规渲染脚本删除了 64 位兼容性。现在,当我尝试发布我的应用程序时,我从 Google Play 控制台收到了一条警告消息。所以我想如果我们还在使用 renderscript,我们将不得不继续使用支持版本,而不是暂时迁移到 AndroidX。

      【讨论】:

      • 我在 Google Play 中使用 RenderScript不支持模式发布了一个应用程序(封闭 Alpha 版),但没有收到任何警告。但我确实注意到文件大小小了大约 2MB,并且 Google Play 中的Native platforms 被列为None。启用支持模式后,共有 4 个 (arm64-v8a, armeabi-v7a, x86, x86_64)。
      • ok 将 renderscriptSupportModeEnabled 设置为 false 可以解决 Android 6 问题(我认为),然后在 22 上设置 renderscriptTargetApi 可以解决 64 位问题。但毕竟,我们仍然在 Xiomi Redmi Go (android 8.1 ???) 上崩溃。希望这可以帮助某人
      【解决方案7】:

      我遇到了同样的问题。唯一对我有用的东西(在尝试了其中一些之后)是更新到最新的构建工具版本(29.0.3),当这些问题最初发布时我不确定它是否存在:

      buildToolsVersion '29.0.3'
      

      【讨论】:

        【解决方案8】:
        android {
            //...
            defaultConfig {
                //...
        
                renderscriptTargetApi 21
                renderscriptSupportModeEnabled true
            }
        }
        

        【讨论】:

        • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
        • @vakio:为什么没有答案?有一个解释会更有用,尤其是将它与现有答案区分开来,但它看起来像是我的答案。
        • 审阅时可供选择的模板并不总是 100% 符合问题所在。这是一个答案,但不是一个完整的答案。并且有类似的答案,所以如果有解释为什么这个答案不同会很有帮助
        • 我正在提供修复您的错误所必需的内容,所以如果您有任何问题,请告诉我,所以对于这个错误,特别是将代码放到您的 gradle 文件中
        猜你喜欢
        • 1970-01-01
        • 2019-03-01
        • 2013-11-27
        • 2015-09-22
        • 1970-01-01
        • 2019-02-24
        • 2019-08-07
        • 1970-01-01
        • 2016-01-18
        相关资源
        最近更新 更多