1
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)
4

3 回答 3

1

将此添加到您的 C 编译器附加选项中,它对我有用:

   -Wl,--export-all-symbols -Wl,--add-stdcall-alias
于 2016-11-15T14:55:16.853 回答
0

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

void native print();

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

这可能是由几件事引起的:

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

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


当我引起你的注意时,Graph.HelloWorld这是一个严重的 Java 风格违规。假设这Graph是一个包名,它应该完全是小写的。此外,建议(对于“丢弃”代码以外的任何代码)遵循使用反向域名作为包名称前缀的约定......这样您的“图形”包就不会意外地与其他人的包发生冲突。

于 2013-05-14T11:06:04.817 回答
0

根据这个错误

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

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

于 2013-05-14T09:55:53.017 回答