Исключение Ljava/lang/UnsatisfiedLinkError
В настоящее время я пытаюсь собрать и запустить этот проект: https://github.com/arrayfire/androidcl на AT&T Samsung Galaxy S3. Проблема в том, когда я пытаюсь запустить: ./ndk-build -C ~/Desktop/ArrayFire/androidcl/jni
Затем я пытаюсь запустить его на телефоне, выбрав "Выполнить -> Запуск от имени -> Приложение Android".
Я получаю "К сожалению, droidcl перестал работать". Я довольно нуб, но после нескольких дней исследований, я думаю, что это связано с NDK. На линии 19 в LiveFeatureActivity, "System.loadLibrary("JNIProcessor");" мое самое большое подозрение
Все файлы находятся на Git. Помощь была бы признательна, так как я пытался запустить ее в течение 3 дней, но безрезультатно.
Вот что говорит ndk-build:
./ndk-build -C ~/Desktop/ArrayFire/androidcl/jni
Android NDK: WARNING:/home/laptop/Desktop/ArrayFire/androidcl/jni/Android.mk:JNIProcessor: non-system libraries in linker flags: /usr/lib/libOpenCL.so
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
make: Entering directory `/home/laptop/Desktop/ArrayFire/androidcl/jni'
[armeabi] Compile++ arm : JNIProcessor <= processor.cpp
[armeabi] SharedLibrary : libJNIProcessor.so
arm-linux-androideabi-g++: error: /usr/lib/libOpenCL.so: No such file or directory
make: *** [/home/laptop/Desktop/ArrayFire/androidcl/obj/local/armeabi/libJNIProcessor.so] Error 1
make: Leaving directory `/home/laptop/Desktop/ArrayFire/androidcl/jni'
Вот Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNIProcessor
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := processor.cpp
LOCAL_CPPFLAGS := -DARM -DOS_LNX -DARCH_32 -fexceptions
LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/include
LOCAL_CPPFLAGS += -fexceptions
LOCAL_LDLIBS := -ljnigraphics -llog $(LOCAL_PATH)/libs/libOpenCL.so
include $(BUILD_SHARED_LIBRARY)
Я попытался зайти в файл Android.mk и указать прямо на /usr/lib/libOpenCl.so (который после проверки библиотеки есть), но все равно не работает.
Вот файл logcat:
02-06 22:52:27.515: D/ActivityThread(3233): setTargetHeapUtilization:0.25
02-06 22:52:27.515: D/ActivityThread(3233): setTargetHeapIdealFree:8388608
02-06 22:52:27.515: D/ActivityThread(3233): setTargetHeapConcurrentStart:2097152
02-06 22:52:27.575: W/dalvikvm(3233): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/LiveFeatureActivity;
02-06 22:52:27.575: W/dalvikvm(3233): Class init failed in newInstance call (Lcom/example/LiveFeatureActivity;)
02-06 22:52:27.575: D/AndroidRuntime(3233): Shutting down VM
02-06 22:52:27.575: W/dalvikvm(3233): threadid=1: thread exiting with uncaught exception (group=0x40cb6300)
02-06 22:52:27.575: E/AndroidRuntime(3233): FATAL EXCEPTION: main
02-06 22:52:27.575: E/AndroidRuntime(3233): java.lang.ExceptionInInitializerError
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.Class.newInstanceImpl(Native Method)
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.Class.newInstance(Class.java:1319)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2090)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.ActivityThread.access$600(ActivityThread.java:142)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.os.Looper.loop(Looper.java:137)
02-06 22:52:27.575: E/AndroidRuntime(3233): at android.app.ActivityThread.main(ActivityThread.java:4931)
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.reflect.Method.invokeNative(Native Method)
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.reflect.Method.invoke(Method.java:511)
02-06 22:52:27.575: E/AndroidRuntime(3233): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
02-06 22:52:27.575: E/AndroidRuntime(3233): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
02-06 22:52:27.575: E/AndroidRuntime(3233): at dalvik.system.NativeStart.main(Native Method)
02-06 22:52:27.575: E/AndroidRuntime(3233): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load JNIProcessor: findLibrary returned null
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.Runtime.loadLibrary(Runtime.java:365)
02-06 22:52:27.575: E/AndroidRuntime(3233): at java.lang.System.loadLibrary(System.java:535)
02-06 22:52:27.575: E/AndroidRuntime(3233): at com.example.LiveFeatureActivity.<clinit>(LiveFeatureActivity.java:19)
02-06 22:52:27.575: E/AndroidRuntime(3233): ... 15 more
02-06 22:52:43.723: I/Process(3233): Sending signal. PID: 3233 SIG: 9
2 ответа
UnsatisfiedLinkError
вы получаете при запуске приложения просто потому, что ваш модуль не удалось собрать, и, следовательно, не был включен в приложение. Получение сборки NDK для связи с libOpenCL.so
должен решить это.
Сначала вам нужно приобрести libOpenCL.so
ссылаться на него, который вы сможете найти на целевом устройстве (если его там нет, это приложение все равно не будет работать). На моих устройствах библиотека OpenCL находится в /system/vendor/lib/libOpenCL.so
, но вам может понадобиться возиться с adb shell
найти его. Чтобы скопировать его на свой локальный компьютер, запустите adb pull /system/vendor/lib/libOpenCL.so
,
Если вы положите эту библиотеку в свой jni/
каталог, то вам просто нужно иметь libOpenCL.so
в вашем LOCAL_LDLIBS
переменная. В противном случае я обычно просто помещаю копию этой библиотеки в каталог платформы NDK (например, $NDK_DIR/platforms/android-17/arch-arm/usr/lib/
), а затем он доступен для всех приложений, добавив -lOpenCL
на ваш LOCAL_LDLIBS variable
, В обоих случаях вы, вероятно, получите предупреждение о несистемных библиотеках в флагах компоновщика, но их следует безопасно игнорировать.
@Cookiez Не уверен, что вы наткнулись на этот репозиторий с помощью поиска Google или после прочтения поста в блоге, о котором я писал. Если вы не знаете о публикации, просмотрите этот пост, чтобы узнать, как запустить код на устройстве Android. Дайте мне знать, если вы все еще не можете запустить приложение.
Прадип.