使用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这个答案)