native关键字
native是一个计算机函数,它修饰的方法就是一个非java代码的接口,方法的具体实现并不是java,而是由其他语言(比如c或者c++)。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码
关于native更多了解,可以去百度。下面我将在windows平台演示一个java调用本地方法的例子,为什么要说平台呢,因为不同平台的动态链接库的文件不一样,比如说windows是后缀为“.dll”的文件,而linux平台是“lib****.so”...
本例环境:
windows7 64位
jdk 32位
Microsoft Visual C++环境
1.创建MyNative java类
1 public class MyNative 2 { 3 public void showParms( String s, int i, boolean b ) 4 { 5 showParms0( s, i , b ); 6 } 7 private native void showParms0( String s, int i, boolean b );//定义本地方法 8 static 9 { 10 System.loadLibrary( "MyNative" );//静态加载MyNative.dll 11 } 12 public static void main( String[] args ) 13 { 14 MyNative obj = new MyNative(); 15 obj.showParms( "Hello", 23, true );//测试本地方法 16 obj.showParms( "World", 34, false ); 17 } 18 }
2.编译类
3.生成.h头文件
会生成MyNative.h文件,内容如下:
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class MyNative */ 4 5 #ifndef _Included_MyNative 6 #define _Included_MyNative 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: MyNative 12 * Method: showParms0 13 * Signature: (Ljava/lang/String;IZ)V 14 */ 15 JNIEXPORT void JNICALL Java_MyNative_showParms0 16 (JNIEnv *, jobject, jstring, jint, jboolean); 17 18 #ifdef __cplusplus 19 } 20 #endif 21 #endif
第一个参数是调用 JNI 方法时使用的 JNI Environment 指针。第二个参数是指向在此 Java 代码中实例化的 Java 对象 MyNative 的一个句柄。其他参数是方法本身的参数。请注意,MyNative.h 包括头文件 jni.h。jni.h 包含 JNI API 和变量类型(包括jobject、jstring、jint、jboolean,等等)的原型和其他声明。
4.编写c语言类文件MyNative.c
1 #include <stdio.h> 2 #include "MyNative.h" 3 JNIEXPORT void JNICALL Java_MyNative_showParms0 4 (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b) 5 { 6 const char* szStr = (*env)->GetStringUTFChars( env, s, 0 ); 7 printf( "String = [%s] ", szStr );//打印参数s 8 printf( "int = %d ", i ); 9 printf( "boolean = %s ", (b==JNI_TRUE ? "true" : "false") ); 10 (*env)->ReleaseStringUTFChars( env, s, szStr ); 11 }
5.生成.dll文件(这里用到cl命令,所以需要Microsoft Visual C++环境)
说明:这里的d:/java是我的jdk的位置,MyNative.c是要编译的文件,MyNtive.dll是生成的dll文件名。
注意:注意保持jvm的位数和Microsoft Visual C++生成的dll文件位数一致,否则会抛出异常:
Can't load IA 64-bit .dll on a AMD 64-bit ..
结果为:
这样就简单完成了java调用本地方法。当然,在eclipse中及各种也可以像这样调用本地方法,具体怎么实现,大家可以自己去试试调用各种各样的方法,比如说有返回值的方法,static修饰的方法等。