使用jni的java.lang.UnsatisfiedLinkError

时间:2013-05-14 09:44:57

标签: 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);
        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)

3 个答案:

答案 0 :(得分:1)

将此内容添加到您的C编译器中,这对我有用的其他选项:

   -Wl,--export-all-symbols -Wl,--add-stdcall-alias

答案 1 :(得分:0)

根据此错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V

我可以假设您正确指定了本机库的路径,这个问题可能意味着Java无法将本机方法映射到实际的本机函数。因此,库中的本机方法应该存在一些问题,可能您尝试访问的方法签名可能是错误的。

答案 2 :(得分:0)

错误说的是你试图调用这样的方法:

void native print();

Graph.HelloWorld中声明,但JVM无法找到该方法的本机代码实现。

这可能是由以下几点引起的:

  • 您的应用程序尚未使System.loadLibrary(...)加载本机库。

  • 您加载的本机库未声明与Graph.HelloWorld类上的方法的名称和签名匹配的方法。 (类名可能是错误的,或方法名称,或参数类型或结果类型。)


虽然我引起了您的注意,Graph.HelloWorld是一种严重的Java风格违规行为。假设Graph是包名,它应该是完全小写的。此外,建议(除了“丢弃”代码之外的任何内容)遵循使用反向域名为包名称添加前缀的约定...以便您的“图形”包不会意外地与其他人碰撞。