我正在尝试使用JNI加载.so文件(libInfExprParser.so)。我没有这个共享对象的源代码。我遇到了以下错误:
异常信息:"main" java.lang.UnsatisfiedLinkError:/home/tomcat/sahithi/ExprParser/libInfExprParser.so: /home/tomcat/sahithi/ExprParser/libInfExprParser.so: undefined symbol: _ZN8IUStringC1EPKcm 在 java.lang.ClassLoader$NativeLibrary.load(Native Method) java.lang.ClassLoader.loadLibrary0(Unknown Source) java.lang.ClassLoader.loadLibrary(Unknown Source) java.lang.Runtime.loadLibrary0(Unknown Source) java.lang.System.loadLibrary(Unknown Source) expressionparser.Main.(Main.java:20)
Java代码:
我是使用的红帽 Linux 64 位系统。
编辑:
我运行了以下命令以获取依赖库列表:
异常信息:"main" java.lang.UnsatisfiedLinkError:/home/tomcat/sahithi/ExprParser/libInfExprParser.so: /home/tomcat/sahithi/ExprParser/libInfExprParser.so: undefined symbol: _ZN8IUStringC1EPKcm 在 java.lang.ClassLoader$NativeLibrary.load(Native Method) java.lang.ClassLoader.loadLibrary0(Unknown Source) java.lang.ClassLoader.loadLibrary(Unknown Source) java.lang.Runtime.loadLibrary0(Unknown Source) java.lang.System.loadLibrary(Unknown Source) expressionparser.Main.(Main.java:20)
Java代码:
native void parseExpr();
static {
System.loadLibrary("InfExprParser");
System.out.println("Loaded expr parser");
}
public static void main(String[] args) {
Main mainObj = new Main().parseExpr();
}
我是使用的红帽 Linux 64 位系统。
编辑:
我运行了以下命令以获取依赖库列表:
[tomcat@zeus ExprParser]$ readelf -d libInfExprParser.so
Dynamic section at offset 0xa048 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x3ed8
0x000000000000000d (FINI) 0x8628
0x0000000000000004 (HASH) 0x158
0x000000006ffffef5 (GNU_HASH) 0x658
0x0000000000000005 (STRTAB) 0x1cc8
0x0000000000000006 (SYMTAB) 0xb40
0x000000000000000a (STRSZ) 4315 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000003 (PLTGOT) 0x20a420
0x0000000000000002 (PLTRELSZ) 1776 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x37e8
0x0000000000000007 (RELA) 0x2f90
0x0000000000000008 (RELASZ) 2136 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x2f20
0x000000006fffffff (VERNEEDNUM) 3
0x000000006ffffff0 (VERSYM) 0x2da4
0x000000006ffffff9 (RELACOUNT) 26
0x0000000000000000 (NULL) 0x0
在这6个共享库中,有5个位于以下位置:/lib和/lib64
libstdc++.so.6位于以下位置:/usr/lib和/usr/lib64
我不知道依赖库将在哪个位置搜索。我尝试设置LD_LIBRARY_PATH并执行以下jar文件:
$ export LD_LIBRARY_PATH=/lib64:/usr/lib64
$ java -jar -Djava.library.path=/home/tomcat/sahithi/ExprParser:/lib64:/usr/lib64 ExpressionParser.jar
$ export LD_LIBRARY_PATH=/lib:/usr/lib
$ java -jar -Djava.library.path=/home/tomcat/sahithi/ExprParser:/lib:/usr/lib ExpressionParser.jar
似乎这些都不起作用。仍然遇到了之前的错误。还有其他什么我可以尝试的吗?谢谢。