Android - Renderscript 支持库 - 加载 RS jni 库时出错
Android - Renderscript Support Library - Error loading RS jni library
我正在尝试将 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
}
我在 Whosebug 上尝试并找到的所有可能的解决方案都不起作用。我的 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() );
遗憾的是,Renderscript 不适用于 armeabi
架构。好的一面是,您可以在 运行 时间查看设备的架构,而不是 运行 这些设备上的 Renderscript 代码:
System.getProperty("os.arch");
android 错误跟踪器上还有一个未解决的问题,他们指出:
We only ship the support library for armeabi-v7a. This is a known limitation.
https://code.google.com/p/android/issues/detail?id=68520
编辑:如果你想在 armeabi
设备上实现不带 Renderscript 的模糊,你可以简单地缩小图像 Bitmap.createScaledBitmap
设置 filter
到 true
。
一般情况下,您可以通过解压您的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
}
我正在尝试将 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
}
我在 Whosebug 上尝试并找到的所有可能的解决方案都不起作用。我的 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() );
遗憾的是,Renderscript 不适用于 armeabi
架构。好的一面是,您可以在 运行 时间查看设备的架构,而不是 运行 这些设备上的 Renderscript 代码:
System.getProperty("os.arch");
android 错误跟踪器上还有一个未解决的问题,他们指出:
We only ship the support library for armeabi-v7a. This is a known limitation.
https://code.google.com/p/android/issues/detail?id=68520
编辑:如果你想在 armeabi
设备上实现不带 Renderscript 的模糊,你可以简单地缩小图像 Bitmap.createScaledBitmap
设置 filter
到 true
。
一般情况下,您可以通过解压您的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
}