使用NDK C ++中的Renderscript来定位棒棒糖前设备

时间:2015-01-20 23:22:38

标签: android android-ndk renderscript

我想使用我使用Android NDK编译的C ++代码中的Renderscript。我建立了" HelloComputeNDK"与NDK一起提供的样品。它在Lollipop设备上运行良好,但在KitKat(4.4.4)上崩溃,adb logcat上显示以下消息:

E/bcinfo  (28302): Invalid API version: 21 is out of range ('11' - '19')
E/RenderScript(28302): Failed to translate bitcode from version: 21
E/rsC++   (28302): Internal error: Object id 0.
F/libc    (28302): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 28317 (hellocomputendk)
I/DEBUG   (  363): Build fingerprint: 'htc/bm/htc_m8:4.4.4/KTU84P/401507.4:user/release-keys'
I/DEBUG   (  363): Revision: '0'
I/DEBUG   (  363): pid: 28302, tid: 28317, name: hellocomputendk      >>> com.example.android.rs.hellocomputendk <<<
I/DEBUG   (  363): debuggerd: checkTellHTCSettings
I/DEBUG   (  363): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

我在AndroidManifest.xml中设置了minSdkVersion="14",在Application.mk中设置了APP_PLATFORM := android-19,在Android.mk中设置了TARGET_PLATFORM := android-19。我使用以下方法构建示例:

android update project --name HelloComputeNDK --path . --target android-19
ndk-build clean
ndk-build -d
ant -verbose debug install

我已经看到其他地方讨论过类似的崩溃,但这些情况下的问题是缺少APP_PLATFORMTARGET_PLATFORM。这似乎不是问题所在。

我相信我和这个人有同样的问题:https://stackoverflow.com/questions/27704847/ndk-sample-project-hellocomputendk-crasheshttps://stackoverflow.com/questions/27705350/ndk-sample-project-hellocomputendk-problems。我认为这个问题被低估了,因为用户发布了两个似乎重复的问题。我有同样的问题,我相信这是一个合理的问题所以我在这里问。

修改

我正在使用SDK构建工具版本21.1.2和NDK r10d。

在Larry Schiefer回答之后编辑

我还尝试在project.properties中添加以下内容:

renderscript.target=19
renderscript.support.mode=true

这会给出错误&#34; sdklib.build.DuplicateFileException:在APK&#34;内的同一路径上复制文件。因为HelloComputeNDK示例明确地包含&#34; Android.mk&#34;中的RenderScript支持库:

include $(CLEAR_VARS)
LOCAL_MODULE := RSSupport
LOCAL_SRC_FILES := $(SYSROOT_LINK)/usr/lib/rs/lib$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

如果我从Android.mk中删除这些行,则示例构建并成功安装,并且我得到与以前相同的API 21崩溃。

2 个答案:

答案 0 :(得分:3)

这是由于ndk-build中的一个错误,它没有将“-target-api 19”传递给llvm-rs-cc。自NDK r9b中的第一个RS支持以来,RenderScript主机工具(bcc_compat,llvm-rs-c等,从K分支编译,API 19)直到r10c从L分支(API 21)重建时才更新。如果没有明确的选项“-target-api N”,r10c +中的llvm-rs-cc将使用默认的API 21,并且在logcat中看到Kitkat的bcinfo中的失败版本检查。

修复已提交,将在NDK r10e或更高版本中提供:https://android-review.googlesource.com/#/c/124641

答案 1 :(得分:1)

您需要为要定位的Renderscript API版本设置单独的属性。如果您希望定位API 19,请编辑project.properties文件并添加以下内容:

renderscript.target=19
renderscript.support.mode=true

这将为API 19构建Renderscript二进制文件,如果在不同版本上运行,则会回退到兼容的bitcode版本。