JNI UnsatisfiedLinkError未定义符号

时间:2015-06-14 06:16:24

标签: java java-native-interface shared-objects

我正在尝试使用JNI加载.so文件(libInfExprParser.so)。我没有这个共享对象的源代码。我收到以下错误:

  

线程中的异常" main" java.lang.UnsatisfiedLinkError中:/home/tomcat/sahithi/ExprParser/libInfExprParser.so:       /home/tomcat/sahithi/ExprParser/libInfExprParser.so: undefined symbol:_ZN8IUStringC1EPKcm               at java.lang.ClassLoader $ NativeLibrary.load(Native Method)               at java.lang.ClassLoader.loadLibrary0(Unknown Source)               at java.lang.ClassLoader.loadLibrary(Unknown Source)               在java.lang.Runtime.loadLibrary0(未知来源)
              在java.lang.System.loadLibrary(未知来源)               在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();    
}

我正在使用Redhat 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

这些似乎都不起作用。得到了和以前一样的错误。还有什么我可以尝试的吗?感谢。

2 个答案:

答案 0 :(得分:1)

该库依赖于其他一些不存在的共享库,其中包含缺少的入口点。

查看安装说明。

答案 1 :(得分:-3)

请确保在使用System.loadLibrary(" libname")时,必须在系统路径变量上设置该库

作为替代,您可以使用System.load(" lib&#34的路径;),这里您不需要在路径变量中设置lib,只需提供lib的绝对路径或相对路径。

请谴责上述情况,检查您的情况。