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)
答案 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
是包名,它应该是完全小写的。此外,建议(除了“丢弃”代码之外的任何内容)遵循使用反向域名为包名称添加前缀的约定...以便您的“图形”包不会意外地与其他人碰撞。