JNI UnsatisfiedLinkError未定义的符号。

3
我正在尝试使用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代码:
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

似乎这些都不起作用。仍然遇到了之前的错误。还有其他什么我可以尝试的吗?谢谢。

2个回答

1
那个库依赖于另一个未安装的共享库,其中包含缺失的入口点。
请查阅安装说明。

@ChetanVerma 找到了什么? 你那神秘的评论并没有增加任何内容。 - user207421

-3
请确保在使用System.loadLibrary("libname")时,该库必须设置在系统路径变量中。
作为替代方案,您可以使用System.load("path to lib"),这里您不需要设置路径变量,只需提供库的绝对或相对路径即可。
请根据上述场景检查您的情况。

1
请正确设置您的路径,以便在加载库时应该像这样出现- /home/tomcat/sahithi/ExprParser/lib/InfExprParser.so 现在它是这样出现的- /home/tomcat/sahithi/ExprParser/libInfExprParser.so,这是错误的。 - Chetan Verma
你没有任何信息来确定正确的.so文件路径。我们只知道loadLibrary()在指定位置找到它。lib会自动添加到loadLibrary()前面,正如Javadoc中明确说明的那样。显然这是正确的,否则为什么会被加载呢?你也不知道谁投了赞成票或反对票。这是秘密投票。 - user207421
谢谢!你能解释一下load和loadLibrary()生成的路径之间的区别吗?它们在某种程度上都完成了相同的工作。 - Chetan Verma
我建议你阅读Javadoc。我不明白为什么我应该在这里重复所有内容,或者为什么你要回答关于你没有充分研究的事情的问题。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接