Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在现有JDK库中调用现有方法时发生jni java.lang.UnsatisfiedLinkError_Java_Java Native Interface - Fatal编程技术网

在现有JDK库中调用现有方法时发生jni java.lang.UnsatisfiedLinkError

在现有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

我试图调用一个现有的本机方法,但得到了不满意的linkerror,并且不理解为什么,因为我从JDK复制了现有代码,并且没有编写自己的C函数

我从JDK套接字Java源代码中复制了一些代码。在Ubuntu上运行

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见本质量保证: