Насочване към устройства преди близалка с помощта на 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