【问题标题】:Exception Ljava/lang/UnsatisfiedLinkError异常 Ljava/lang/UnsatisfiedLinkError
【发布时间】:2015-02-08 00:44:56
【问题描述】:

我目前正在尝试在 AT&T 三星 Galaxy S3 上构建和运行这个项目:https://github.com/arrayfire/androidcl。问题是当我尝试运行时: ./ndk-build -C ~/Desktop/ArrayFire/androidcl/jni

然后我尝试通过转到“运行 -> 运行方式 -> Android 应用程序”在手机上运行它。

我收到“很遗憾,droidcl 已停止工作”。我是个菜鸟,但经过几天的研究,我认为这与 NDK 有关。在 LiveFeatureActivity 的第 19 行,“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

【问题讨论】:

    标签: eclipse ubuntu opencl unsatisfiedlinkerror arrayfire


    【解决方案1】:

    您在运行应用程序时收到的UnsatisfiedLinkError 仅仅是因为您的模块未能构建,因此未包含在应用程序中。让 NDK 构建链接到 libOpenCL.so 应该可以解决这个问题。

    您首先需要获得一个libOpenCL.so 来链接,您应该能够在目标设备上找到它(如果它不存在,那么这个应用程序无论如何都不会工作)。在我的设备上,OpenCL 库位于/system/vendor/lib/libOpenCL.so,但您可能需要使用adb shell 来查找它。要将其复制到本地计算机,请运行 adb pull /system/vendor/lib/libOpenCL.so

    如果你把这个库放在你的jni/ 目录中,那么你应该只需要在你的LOCAL_LDLIBS 变量中有libOpenCL.so。否则,我通常只是将这个库的副本粘贴到 NDK 平台目录中(例如$NDK_DIR/platforms/android-17/arch-arm/usr/lib/),然后通过将-lOpenCL 添加到您的LOCAL_LDLIBS variable 来供所有应用程序使用。在这两种情况下,您都可能会在链接器标志中收到有关非系统库的警告,但这些应该可以安全地忽略。

    【讨论】:

    • 您好,感谢您的澄清!所以我在 /usr/lib 找到了 libOpenCL.so 文件。我尝试将其复制到位于的位置,但它不会让我。该文件为红色(Ubuntu 终端),而其他“常规”库为青色,就像它们应该的那样。我应该“sudo ldconfig”来创建所需的库吗?
    • @Cookiez 您是如何尝试复制文件的?您是在自己的机器上还是在手机的文件系统(即通过adb shell)上找到/usr/lib 中的libOpenCL.so
    • 啊,原来库坏了(因此是红色而不是浅蓝色)。但无论如何,我在自己的机器上找到了 libOpenCL.so,而不是通过 adb shell。但我也尝试通过 adb shell 进行挖掘,但仍然没有(运行“find / libOpenCL.so”)并手动检查。
    • 您是否确认您的手机确实支持 OpenCL?例如您可以从应用商店运行 OpenCL Info 应用程序之一吗?看看 Galaxy S3 的规格,我不相信它可以。
    • 哦,你是对的。 S3 不支持 OpenCL!我很快就会得到另一个移动设备。我以为 Mali GPU 会支持它,但它只是某些型号。但我已经学会了。再次感谢您的帮助!
    【解决方案2】:

    @Cookiez 不确定您是通过 Google 搜索还是在阅读了我写的关于它的博客文章后偶然发现了这个存储库。如果您不知道该帖子,请通过this 帖子了解如何让代码在 Android 设备上运行。如果您仍然无法运行该应用,请告诉我。

    Pradeep。

    【讨论】:

    • 是的,我已经读过那篇文章了。这就是我设置一切的方式:) 我终于让应用程序启动并运行了!谢谢你们的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多