研究了下 Java native 方法的例子,供需要的同学看看。
首先看下什么是 Native method,参考了下http://www.80×86.cn/article.asp?id=1448上的文章:
Simply put, a native method is the Java interface to non-Java code. It is Java’s link to the “outside world.” More specifically, a native method is a Java method whose implementation is provided by non-Java code, most likely C。
大概意思就是说 native 方法是通过java调用其他 非java的代码。
in your Java class, you mark the methods you wish to implement outside of Java with the native method modifier-much like you would use the public or static modifiers. Then, rather than supplying the method’s body, you simply place a semicolon in its place.The only thing special about this declaration is that the keyword native is used as a modifier. Every other Java method modifier can be used along with native, except abstract.
说的是native关键字跟其他什么public static修饰符一样也可以用来修饰方法,但除了abstract。
This is logical, because the native modifier implies that an implementation exists, and the abstract modifier insists that there is no implementation. Your native methods can be static methods, thus not requiring the creation of an object (or instance of a class).
这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。呵呵。我就不翻译原文了。有兴趣的看看原文去吧。
再查了些资料,就写了如下的代码。这个代码又是helloworld。唉,继续helloworld吧。用java去调用一个用C实现的方法。
/** |
上面已经写好了注释了。刚开始的时候,我直接用了eclipse,但发现后来dll文件容易找不到(eclipse估计估计还得哪里配置下吧)。于是就改为控制台下。
首先用javac命令 编译出class文件,没有编译错误就会产生class文件。
然后执行javah命令。看 javah 的用法。直接控制台下就能看到
R:\native>javah |
直接用javah NativeHelloWorld 就会生成一个.h的文件。如下所示:
/* DO NOT EDIT THIS FILE - it is machine generated */ |
然后在写hello.c
文件如下所示:
|
接下来要做的就是要生成dll文件,这个dll文件就是在类NativeHelloWorld中要load的参数名字。
生成dll文件可以用VC6.0之类的工具。期间在build的时候可能会遇到问题。就是上面的方法签名的地方需要加上参数。如上面的XX,xxx。这个是后来加上去的,不是javah之后就有的.
在build的时候,跟着错误信息就知道了,还会用到其他的dll文件。这个文件到jdk安装目录下search下就OK了。有jni.h,其中jni.h又会用到jni_md.h。直接copy过来到VC的工作路径下。然后就能在debug目录里面找到dll文件了。
此时,已经差不多了。再写个Test就OK了。
/** |
再在控制台下执行javac Test.java java Test就能看到结果了。