java调用c语言编写的方法---本地方法篇之java中的native关键字

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]\n", szStr );//打印参数s
 8   printf( "int = %d\n", i );
 9   printf( "boolean = %s\n", (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 ..

 6.执行编译后的java类文件MyNative.class

结果为:

这样就简单完成了java调用本地方法。当然,在eclipse中及各种也可以像这样调用本地方法,具体怎么实现,大家可以自己去试试调用各种各样的方法,比如说有返回值的方法,static修饰的方法等。

 

posted @ 2018-01-17 17:27  之无情  阅读(12422)  评论(0编辑  收藏  举报