Ориентация на устройства pre-lollipop с использованием Renderscript из NDK C++

Я хотел бы использовать Renderscript из кода C++, который я компилирую с помощью Android NDK. Я создал образец 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

Я установил minSdkVersion="14" в AndroidManifest.xml, APP_PLATFORM := android-19 в Application.mk и TARGET_PLATFORM := android-19 в Android.mk. Я создаю образец, используя:

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

Я видел подобные сбои, обсуждавшиеся в другом месте, но проблема в этих случаях заключалась в отсутствии APP_PLATFORM или TARGET_PLATFORM. Это, кажется, не проблема здесь.

Я считаю, что у меня та же проблема, что и у этого человека: https://stackoverflow.com/questions/27704847/ndk-sample-project-hellocomputendk-crashes, https://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: дубликаты файлов по одному и тому же пути внутри APK», поскольку пример HelloComputeNDK явно включает библиотеку поддержки RenderScript в «Android.mk»:

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, что и раньше.


person aschmied    schedule 20.01.2015    source источник


Ответы (2)


Это связано с ошибкой в ​​ndk-build, которая не передает «-target-api 19» в llvm-rs-cc. С момента первой поддержки RS в NDK r9b инструменты хоста RenderScript (bcc_compat, llvm-rs-c и т. д., скомпилированные из ветки K, API 19) не обновлялись до r10c, когда они были перестроены из ветки L (API 21). Без явного параметра «-target-api N» llvm-rs-cc в r10c+ использует API по умолчанию, который равен 21, и не выполняет проверку версии в bcinfo Kitkat, как показано в logcat.

Исправление отправлено и будет доступно в NDK r10e или более поздней версии: https://android-review.googlesource.com/#/c/124641

person andrewhsieh    schedule 23.01.2015
comment
Что объясняет его. Спасибо. - person aschmied; 28.01.2015

Существует отдельное свойство, которое необходимо установить для целевой версии Renderscript API. Если вы хотите настроить таргетинг на API 19, отредактируйте файл project.properties и добавьте следующее:

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

Это создаст ваши двоичные файлы Renderscript для API 19 и вернется к совместимой версии битового кода, если он запускается в другой версии.

person Larry Schiefer    schedule 21.01.2015
comment
Спасибо за ответ. Я забыл упомянуть, что я тоже пробовал это, и это не решает проблему. Я обновил вопрос. - person aschmied; 21.01.2015
comment
Я не вижу обновления вопроса. Это показывает, что был установлен только основной целевой API, а не целевой объект рендерскрипта. - person Larry Schiefer; 21.01.2015
comment
Ах, извините. Я прокомментировал, прежде чем писать обновление ... должен был сделать это наоборот. Это обновлено сейчас. - person aschmied; 21.01.2015
comment
Попробуйте удалить строку renderscript.mode.support=true, но оставьте строку renderscript.target. - person Larry Schiefer; 21.01.2015
comment
Это заставляет его строиться, но я получаю тот же крах. Кроме того, я считаю, что когда я это делаю, он загружает правильный libRSSupport.so Android.mk, потому что я вижу этот вывод из ndk-build: [armeabi-v7a] Prebuilt: libRSSupport.so ‹= ‹NDK›/platforms/android-19/arch -arm/usr/lib/rs/ - person aschmied; 21.01.2015