Является ли Renderscript несовместимым с библиотеками NDK в том же проекте?

У меня проблема с созданием приложения для Android, использующего как Renderscript, так и собственный код, сгенерированный с помощью NDK.

По сути, я использую инструменты NDK для создания библиотеки под названием sprstr_native.so. Мне удалось без проблем вызывать их функции C++ через код Java. Затем мне понадобились некоторые функции Renderscript (в частности, ScriptIntrinsicYuvToRGB), поэтому я добавил в свой проект Eclipse ссылку на библиотеку относительной поддержки, renderscript-v8.jar, и эту строку в файле свойств проекта:

renderscript.support.mode=true

Теперь проблема: Android больше не может распознать мой sprstr_native, и приложение вылетает при вызове кода:

System.loadLibrary("sprstr_native");

Это стек:

11-23 17:46:54.450: E/AndroidRuntime(3901): FATAL EXCEPTION: main
11-23 17:46:54.450: E/AndroidRuntime(3901): java.lang.ExceptionInInitializerError
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.Class.newInstanceImpl(Native Method)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.Class.newInstance(Class.java:1409)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.os.Looper.loop(Looper.java:130)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at android.app.ActivityThread.main(ActivityThread.java:3683)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.reflect.Method.invokeNative(Native Method)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.reflect.Method.invoke(Method.java:507)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at dalvik.system.NativeStart.main(Native Method)
11-23 17:46:54.450: E/AndroidRuntime(3901): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load sprstr_native: findLibrary returned null
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at java.lang.System.loadLibrary(System.java:554)
11-23 17:46:54.450: E/AndroidRuntime(3901):     at com.lag.proj.MainActivity.<clinit>(MainActivity.java:18)
11-23 17:46:54.450: E/AndroidRuntime(3901):     ... 15 more

Любопытно, если я удалю все ссылки на Renderscript, нативная библиотека снова заработает! Пожалуйста, не говорите мне, что существует несовместимость между Renderscript и кодом NDK!


person TheUnexpected    schedule 23.11.2013    source источник
comment
Эта предполагаемая причина кажется ложной. Знаете ли вы, что System.loadLibrary("sprstr_native"); приведет к поиску libsprstr_native.so, а не sprstr_native.so ?? Если вы перечисляете содержимое .apk с помощью анализатора / средства просмотра zip-файлов, какие фактические файлы .so содержатся внутри?   -  person Chris Stratton    schedule 23.11.2013
comment
Я не могу проверить прямо сейчас, но я могу гарантировать, что загрузка библиотеки правильная, просто потому, что она работала до добавления Renderscript и возвращается к работе, если я деактивирую Renderscript, как я писал ранее.   -  person TheUnexpected    schedule 23.11.2013


Ответы (1)


Я, вероятно, решил это, но не без других ошибок, которые возникли после (см. support-libr">Получение различных ошибок для разных платформ с помощью Renderscript Support Library). Кстати, этап загрузки библиотеки должен быть решен добавлением этой строки в файл Application.mk:

APP_ABI := all

Это позволяет NDK компилировать объекты для всех поддерживаемых архитектур.

person TheUnexpected    schedule 24.11.2013