原代码:
public class test { /**
* @param args
*/
static
{
System.loadLibrary("TransferEth");
}
public native void Transfer_Ethernet(String s); public static void main(String[] args) {
test t= new test();
t.Transfer_Ethernet("TransScale.ini");
}
}错误信息如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Transfer_Ethernet(Ljava/lang/String;)V
at test.Transfer_Ethernet(Native Method)
at test.main(test.java:17)
public class test { /**
* @param args
*/
static
{
System.loadLibrary("TransferEth");
}
public native void Transfer_Ethernet(String s); public static void main(String[] args) {
test t= new test();
t.Transfer_Ethernet("TransScale.ini");
}
}错误信息如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Transfer_Ethernet(Ljava/lang/String;)V
at test.Transfer_Ethernet(Native Method)
at test.main(test.java:17)
可是如果我改一下名,把这个 System.loadLibrary("TransferEth"); 改成 System.loadLibrary("TransferEth1"); ,就提示不一样的错误,即不能发现main class,说明java应该还是找到了这个dll吧,要是就是不行,晕了。
你应该声明一下。
我刚刚没看到。
System.loadLibrary("TransferEth1"); 动态链接库的名字一定要正确
public native void Transfer_Ethernet(String s); 一旦生成dll后方法名Transfer_Ethernet不能改了
如果是cmd运行必须写类全名(包含包名),在eclipse中就无所谓了,只要前面工作做好,直接运行就可以了
http://blog.csdn.net/shibenjie/archive/2009/06/03/4238287.aspx
javac :重新编译
javah :重新生成头文件
如果是VC++中生成正确的.dll文件,放置在与java源文件同一目录,源文件中不要带包名。
如果是第一次使用JNI,建议先拿个简单的程序先测试下,例如HelloWorld
JNI 生成的方法名类似这样的,但C++编译器在 Link 时符号表里面的名字不一定是像
Java_sample_HelloNative_sayHello 这样的名字,比如我用 GNU 编译器 Link 时得到 Java_sample_HelloNative_sayHello@2342345 这样的名字。这样的话就会说找不到方法名会出错的。在 linker 的参数列表中指定一个 .def 文件后就正常了,比如我这样:
EXPORTS
Java_sample_HelloNative_sayHello =Java_sample_HelloNative_sayHello
Java_sample_HelloNative_greet =Java_sample_HelloNative_greet至于怎么在 C++ Linker 后面指定这个参数我也忘记了,现在找不到以前配置时的步骤,只有这个 .def 文件。