使用jni的java.lang.UnsatifiedLinkError
} 输出:使用jni的java.lang.UnsatifiedLinkError,java,java-native-interface,Java,Java Native Interface,} 输出: class HelloWorld { public native void print(); //native method static //static initializer code { try{ String path = System.getProperty("java.library.path"); System.out.println(path); Syste
class HelloWorld {
public native void print(); //native method
static //static initializer code
{
try{
String path = System.getProperty("java.library.path");
System.out.println(path);
System.loadLibrary("CLibHelloWorld1");
//System.load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll");
//Runtime.getRuntime().load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll");
System.out.println("Loaded CallApi");
}catch(UnsatisfiedLinkError e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
HelloWorld hw = new HelloWorld();
hw.print();
}
根据这个错误
C:\TE_CDA_Project\Test\native
Loaded CallApi
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V
at Graph.HelloWorld.print(Native Method)
at Graph.HelloWorld.main(HelloWorld.java:26)
我可以假设您正确指定了本机库的路径,这个问题可能意味着Java无法将本机方法映射到实际的本机函数。因此,库中的本机方法应该存在一些问题,可能您试图访问的方法签名可能是错误的 根据这个错误
C:\TE_CDA_Project\Test\native
Loaded CallApi
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V
at Graph.HelloWorld.print(Native Method)
at Graph.HelloWorld.main(HelloWorld.java:26)
我可以假设您正确指定了本机库的路径,这个问题可能意味着Java无法将本机方法映射到实际的本机函数。因此,库中的本机方法应该存在一些问题,可能您试图访问的方法签名可能是错误的 错误是说您试图调用如下方法:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V
在Graph.HelloWorld
中声明,但JVM无法找到该方法的本机代码实现
这可能是由以下几方面造成的:
- 您的应用程序尚未使
加载本机库System.loadLibrary(…)
- 加载的本机库没有声明与
类上的方法的名称和签名匹配的方法。(类名、方法名、参数类型或结果类型可能错误。)Graph.HelloWorld
尽管我引起了您的注意,
Graph.HelloWorld
是一个严重的Java风格冲突。假设Graph
是一个包名,它应该是完全小写的。此外,建议(对于“扔掉”代码以外的任何代码)遵循使用反向域名作为包名前缀的惯例。。。这样您的“graph”包就不会意外地与其他人的发生冲突。错误是,您试图调用如下方法:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V
在Graph.HelloWorld
中声明,但JVM无法找到该方法的本机代码实现
这可能是由以下几方面造成的:
- 您的应用程序尚未使
加载本机库System.loadLibrary(…)
- 加载的本机库没有声明与
类上的方法的名称和签名匹配的方法。(类名、方法名、参数类型或结果类型可能错误。)Graph.HelloWorld
尽管我引起了您的注意,
Graph.HelloWorld
是一个严重的Java风格冲突。假设Graph
是一个包名,它应该是完全小写的。此外,建议(对于“扔掉”代码以外的任何代码)遵循使用反向域名作为包名前缀的惯例。。。这样,您的“图形”包就不会意外地与其他人的发生冲突。将此添加到您的C编译器中它对我有用的其他选项:
void native print();
将此添加到您的C编译器中它对我有用的其他选项:
void native print();
这很可能是因为java.library.Path的Path变量当前未设置。这是Java从中提取所需库的路径。@Paritosh:我认为您也应该发布本机代码。此异常通常由于本机方法的签名错误而发生。请参见此处的示例:(如果您面临相同的问题,请不要忘记+1该答案)这很可能是因为java.library.Path的Path变量当前未设置。这是Java从中提取所需库的路径。@Paritosh:我认为您也应该发布本机代码。此异常通常由于本机方法的签名错误而发生。看下面的例子:(如果你面临同样的问题,别忘了+1这个答案)