使用 NDK C++ 中的 Renderscript 定位棒棒糖前设备
Targeting pre-lollipop devices using Renderscript from NDK C++
我想在使用 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_PLATFORM
或 TARGET_PLATFORM
。这似乎不是这里的问题。
我相信我和这个人有同样的问题:, 。我认为这个问题被否决了,因为用户发布了两个似乎重复的问题。我有同样的问题,我认为这是一个合理的问题,所以我在这里问。
编辑
我正在使用 SDK 构建工具版本 21.1.2 和 NDK r10d。
在 Larry Schiefer 回答后编辑
我还尝试在 project.properties 中添加以下内容:
renderscript.target=19
renderscript.support.mode=true
这会产生错误 "sdklib.build.DuplicateFileException: Duplicate files at the same path inside 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 崩溃。
您需要为要定位的 Renderscript API 版本设置一个单独的 属性。如果你想定位 API 19,那么编辑你的 project.properties
文件并添加这些:
renderscript.target=19
renderscript.support.mode=true
这将为 API 19 构建您的 Renderscript 二进制文件,如果它是 运行 在不同的版本上,则回退到兼容的位码版本。
这是由于 ndk-build 中的一个错误,它没有将“-target-api 19”传递给 llvm-rs-cc。自从 NDK r9b 首次支持 RS 以来,RenderScript 宿主工具(bcc_compat、llvm-rs-c 等,从 K 分支编译,API19)直到 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
我想在使用 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_PLATFORM
或 TARGET_PLATFORM
。这似乎不是这里的问题。
我相信我和这个人有同样的问题:, 。我认为这个问题被否决了,因为用户发布了两个似乎重复的问题。我有同样的问题,我认为这是一个合理的问题,所以我在这里问。
编辑
我正在使用 SDK 构建工具版本 21.1.2 和 NDK r10d。
在 Larry Schiefer 回答后编辑
我还尝试在 project.properties 中添加以下内容:
renderscript.target=19
renderscript.support.mode=true
这会产生错误 "sdklib.build.DuplicateFileException: Duplicate files at the same path inside 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 崩溃。
您需要为要定位的 Renderscript API 版本设置一个单独的 属性。如果你想定位 API 19,那么编辑你的 project.properties
文件并添加这些:
renderscript.target=19
renderscript.support.mode=true
这将为 API 19 构建您的 Renderscript 二进制文件,如果它是 运行 在不同的版本上,则回退到兼容的位码版本。
这是由于 ndk-build 中的一个错误,它没有将“-target-api 19”传递给 llvm-rs-cc。自从 NDK r9b 首次支持 RS 以来,RenderScript 宿主工具(bcc_compat、llvm-rs-c 等,从 K 分支编译,API19)直到 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