Android UnsatisfiedLinkError:加载共享库的问题

时间:2011-11-10 07:43:43

标签: android java-native-interface shared-libraries

我正在编译一些Java代码,将它放入.JAR中,然后在其上运行dx --dex。我正在通过adb将我的文件推送到Android设备,但我在运行时链接我的共享库时遇到问题。

在HostConnection.java中,我有以下代码来加载我的库:

static {
    System.loadLibrary("hostConnection");
}

我正在以这种方式加载应用程序:

adb shell
su
export CLASSPATH=/data/local/device.jar
export LD_LIBRARY_PATH=/data/local/libhostConnection.so
exec app_process /system/bin com.device.client.Main

我很遗憾地收到以下错误:

D/dalvikvm( 1616): DexOpt: load 482ms, verify 84ms, opt 10ms
D/dalvikvm( 1608): DexOpt: --- END 'device.jar' (success) ---
D/dalvikvm( 1608): DEX prep '/data/local/device.jar': unzip in 1715ms, rewrite 1287ms
W/dalvikvm( 1608): Exception Ljava/lang/UnsatisfiedLinkError; thrown during Lcom/device/client/HostConnection;.<clinit>
D/AndroidRuntime( 1608): Shutting down VM
W/dalvikvm( 1608): threadid=1: thread exiting with uncaught exception (group=0x4001d830)
I/Process ( 1608): Sending signal. PID: 1608 SIG: 9
E/AndroidRuntime( 1608): *** FATAL EXCEPTION IN SYSTEM PROCESS: main
E/AndroidRuntime( 1608): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 1608):    at com.device.client.Main.<init>(Main.java:27)
E/AndroidRuntime( 1608):    at com.device.client.Main.main(Main.java:21)
E/AndroidRuntime( 1608):    at com.android.internal.os.RuntimeInit.finishInit(Native Method)
E/AndroidRuntime( 1608):    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
E/AndroidRuntime( 1608):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1608): Caused by: java.lang.UnsatisfiedLinkError: Library hostConnection not found
E/AndroidRuntime( 1608):    at java.lang.Runtime.loadLibrary(Runtime.java:461)
E/AndroidRuntime( 1608):    at java.lang.System.loadLibrary(System.java:557)
E/AndroidRuntime( 1620):    at com.device.client.HostConnection.<clinit>(HostConnection.java:25)

HostConnection.java中的第25行确实是System.loadLibrary(“hostConnection”)。

我的库名为libhostConnection.so,我的.jar名为device.jar。它们都存储在/ data / local中。我已经尝试将共享库移动到/ system / lib,但shell不允许我复制文件(只读)。

我不确定我做错了什么,但我相信它在运行应用程序时找不到用于链接的共享库。我不确定我是否在导出中使用了错误的变量,或者我是否应该做其他事情。

有人可以帮帮我吗?非常感谢。

非常感谢!

2 个答案:

答案 0 :(得分:1)

为什么不尝试将您的库放入eclipse项目中的lib / armeabi(-v7a)目录?我相信这是链接共享库的推荐方式。

答案 1 :(得分:0)

我明白了。变量是正确的,但路径应该只是文件夹,而不是.so文件由于某种原因:

export LD_LIBRARY_PATH = / data / local

这实际上有效。

谢谢。