安卓 - Renderscript支持库 - 加载RS jni库时出错

4
我正在尝试将Renderscript支持库包含到我的项目中。我遇到了以下错误。
android.support.v8.renderscript.RSRuntimeException: Error loading RS jni library: java.lang.UnsatisfiedLinkError: Couldn't load rsjni: findLibrary returned null

我没有使用任何Renderscript jar文件,我正在尝试通过Gradle来使用它。

这是我的Gradle.build文件

顶层

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:1.2.3'
}
}

ext {
compileSdkVersion="Google Inc.:Google APIs:22"
buildToolsVersion="23.0.1"
playStoreMinSdkVersion=16
amazonStoreMinSdkVersion=8
targetSdkVersion=22
versionCode=20
versionName="3.3.0"
runProguard=true
zipAlign=true
proguardConfiguration='../proguard.config'
}

allprojects {
repositories {
    jcenter()
}
}

特定应用

defaultConfig {
    applicationId "**REMOVED**"
    //noinspection GroovyAssignabilityCheck
    targetSdkVersion rootProject.ext.targetSdkVersion
    //noinspection GroovyAssignabilityCheck
    versionCode rootProject.ext.versionCode
    //noinspection GroovyAssignabilityCheck
    versionName rootProject.ext.versionName

    renderscriptTargetApi 23
    renderscriptSupportModeEnabled true
}

我在stackoverflow上尝试了所有可能的解决方案,但都没能解决问题。我也在我的proguard配置中包含了这个。

#RenderScript
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class android.support.v8.renderscript.** { *; }

编辑:这里是我实际使用renderscript的实现,也是在调用时导致我的应用程序崩溃的地方。

public static BitmapDrawable Blur ( View view ){

    Bitmap image = GetScreenshot( view );

    int width = Math.round( image.getWidth() * DEFAULT_BITMAP_SCALE );
    int height = Math.round( image.getHeight() * DEFAULT_BITMAP_SCALE );

    Bitmap inputBitmap = Bitmap.createScaledBitmap( image, width, height, false );

    Bitmap outputBitmap = Bitmap.createBitmap( inputBitmap );

    RenderScript rs = RenderScript.create( view.getContext() );
    ScriptIntrinsicBlur intrinsicBlur = ScriptIntrinsicBlur.create( rs, Element.U8_4(rs) );

    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap( rs, outputBitmap );

    intrinsicBlur.setRadius( DEFAULT_BLUR_RADIUS );
    intrinsicBlur.setInput( tmpIn );
    intrinsicBlur.forEach( tmpOut );

    tmpOut.copyTo( outputBitmap );

    inputBitmap.recycle();
    rs.destroy();

    return new BitmapDrawable( outputBitmap );
}

这是确切的一行代码。

RenderScript rs = RenderScript.create( view.getContext() );

你应该发布更多与实际问题相关的代码:例如,你在哪里以及如何加载RS库。此外,你的项目配置(其中定义了RS库、其源等)也可能有所帮助。 - wasyl
你是想在设备上运行应用程序还是模拟器上? - wasyl
这是在装有 Android 2.3.4 的实体 Droid 3 上。它与运行 5.0 的设备配合良好。我认为这是因为它没有使用支持库? - Nick H
你可能需要将 renderscriptTargetApi 数字降低到你实际的目标 API(或最小目标 API - 两者都尝试一下)。目前你的 targetSdkVersion=22,但是 renderscript 目标 api 设置为 23。看起来有些可疑。 - wasyl
我将目标API修正为22级以匹配我的项目目标API。看起来是同样的问题。 - Nick H
2个回答

12

很遗憾,Renderscript不支持armeabi架构。好消息是你可以在运行时检查设备的架构,并且不在这些设备上运行Renderscript代码:

System.getProperty("os.arch");

在Android的错误跟踪器上,也有一个问题未解决,其中他们指出:

我们只为armeabi-v7a提供支持库。这是已知的限制。

https://code.google.com/p/android/issues/detail?id=68520

编辑:如果您想在armeabi设备上实现模糊而不使用Renderscript,则可以通过使用Bitmap.createScaledBitmap将图像简单地缩小,并将filter设置为true来实现。

1
通常情况下,您可以通过解压apk文件,然后检查lib文件夹来解决此问题。 lib文件夹包含按不同系统架构(arm64-v8a、armeabi、armeabi-v7a、mips、x86等)分组的本地库。
有时,某些库仅存在于某些系统架构中,而不是所有架构,因此在使用此本地库中的任何代码之前,您需要先检查系统架构,例如Renderscript支持库。
对于Renderscript异常,您可以执行以下操作。
ArrayList<String> abis = new ArrayList<>();

 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
   abis.add(Build.CPU_ABI);
 } else {
    for (String abi : Build.SUPPORTED_ABIS) {
        abis.add(abi);
    }
 }

 if (abis.contains("x86") || abis.contains("mips") || abis.contains("armeabi-v7a")) {
   // do Renderscript stuff
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接