在现有JDK库中调用现有方法时发生jni java.lang.UnsatisfiedLinkError
我试图调用一个现有的本机方法,但得到了不满意的linkerror,并且不理解为什么,因为我从JDK复制了现有代码,并且没有编写自己的C函数 我从JDK套接字Java源代码中复制了一些代码。在Ubuntu上运行在现有JDK库中调用现有方法时发生jni java.lang.UnsatisfiedLinkError,java,java-native-interface,Java,Java Native Interface,我试图调用一个现有的本机方法,但得到了不满意的linkerror,并且不理解为什么,因为我从JDK复制了现有代码,并且没有编写自己的C函数 我从JDK套接字Java源代码中复制了一些代码。在Ubuntu上运行 public class Sokket { static { System.loadLibrary ("net"); } static { initProto (); } // rest ommited for brevity } 运行此代码将导致: Excepti
public class Sokket {
static {
System.loadLibrary ("net");
}
static {
initProto ();
}
// rest ommited for brevity
}
运行此代码将导致:
Exception in thread "main" java.lang.UnsatisfiedLinkError:
be.good.Sokket.initProto()V
at be.good.Sokket.initProto(Native Method)
at be.good.Sokket.<clinit>(Sokket.java:12)
线程“main”java.lang.UnsatifiedLinkError中出现异常:
bee.good.Sokket.initProto()V
at be.good.Sokket.initProto(本机方法)
at be.good.Sokket.(Sokket.java:12)
我尝试了其他本机方法,但出现了相同的错误,我更改了“net”的名称以测试是否可以找到该库,然后我确实得到了一个错误,即在java.library.path
中找不到该库,我更改了“initProto”的名称以测试是否可以找到该方法,然后我得到了相同的错误。因此,在我看来,JDK lib目录中的“libnet.So”没有initProto(),也没有createSocket()
当我使用-verbose:jni
运行时,我确实看到加载了很多lib,但没有对“net”或“initProto”的引用
如何从自己的代码中调用现有的本机方法?您应该使用
System.loadLibrary(“libnet”)代码>。而且,将其放在JDF文件夹下可能不是一个好主意。本机符号名称是从包和类的名称派生的,因此它将查找名为Java\u be\u good\u Sokket\u initProto
的函数,该函数(可能)在该库中不存在。但是,看起来确实可以手动链接这些方法:(虽然我从未尝试过)@Daniele“net”
在linux上被映射到libnet.so
作为文件名,所以这部分是正确的。@jornverne不确定如何工作;当然,您不想调用System.loadLibrary(“libnet.so”)代码>;因为您需要省略.so
后缀。事实上,System.loadLibrary(“net”)
将查找net.so
文件,而AFAIU不是mapped@Daniele见本质量保证: