2

我想將Renderscript支持庫加入到我的項目中。我收到以下錯誤。Android - Renderscript支持庫 - 加載RS jni庫時出錯

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 
} 

一切我嘗試&發現作爲計算器可能的解決方案是行不通的。我也有這個包括在我的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()); 
+0

你應該張貼相關的實際問題,更多的代碼:在哪裏以及你如何加載RS庫,例如。此外,你的項目配置(RS庫的定義,其來源等)也可能幫助 – wasyl

+0

當然,有一刻。 –

+0

您是否試圖在設備上或仿真器上運行應用程序? – wasyl

回答

8

不幸的renderScript是不適用於armeabi架構。光明的一面是,你可以在運行時檢查一下該設備的結構,而不是在這些設備上運行的renderScript代碼:

System.getProperty("os.arch"); 

也有對Android的bug跟蹤系統,在那裏他們國家的問題打開:

我們只提供armeabi-v7a的支持庫。這是一個已知的限制。

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

編輯:如果要實現對armeabi設備沒有的renderScript模糊,你可以簡單地用Bitmap.createScaledBitmap設置filtertrue縮減圖像。

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 
}