【问题标题】:Targeting pre-lollipop devices using Renderscript from NDK C++使用来自 NDK C++ 的 Renderscript 定位棒棒糖前设备
【发布时间】:2015-01-20 23:22:37
【问题描述】:

我想从使用 Android NDK 编译的 C++ 代码中使用 Renderscript。我构建了 NDK 附带的“HelloComputeNDK”示例。它在 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。

在拉里·希弗回答后编辑

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

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

这会给出错误“sdklib.build.DuplicateFileException: Duplicate files at the same path within the APK”,因为 HelloComputeNDK 示例明确包含“Android.mk”中的 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 崩溃。

【问题讨论】:

    标签: android android-ndk renderscript


    【解决方案1】:

    这是由于 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,并且在 Kitkat 的 bcinfo 中的版本检查失败,如 logcat 中所示。

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

    【讨论】:

    • 这就解释了。谢谢。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答。我忘了提到我也试过这个,但它并没有解决问题。我已经更新了问题。
    • 我没有看到问题的更新。它表明只设置了主目标 API,而不是 renderscript 目标。
    • 对不起。我在写更新之前发表了评论......应该反过来做。现在更新了。
    • 尝试删除renderscript.mode.support=true 行,但保留renderscript.target 行。
    • 这可以构建,但我遇到了同样的崩溃。另外,我相信它会在我执行 Android.mk 时引入正确的 libRSSupport.so,因为我看到来自ndk-build 的输出:“[armeabi-v7a] Prebuilt : libRSSupport.so /platforms/android- 19/arch-arm/usr/lib/rs/"
    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2018-09-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多