java之JNI使用说明

来源:互联网 发布:广告宣传语音制作软件 编辑:程序博客网 时间:2024/05/20 03:46

转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/45441587


作者:小马


JAVA可以通过JNI接口访问本地的动态连接库(JAVA NATIVE INTERFACE),从而扩展JAVA的功能。我们知道JAVA有一个最大的有点就是它的平台无关性,但这个优点也导致了java访问底层设备的能力不足,而JNI正是弥补了这种不足。


下面通过一个完整的,简单的示例,来详细说明JNI的使用。

首先我们在eclipse下编写一个java的小程序,这个程序通过调用一个本地的方法输出字符串到命令行。


package com.mess;public class ShowMessage {private native void ShowMessage(String msg);static{System.loadLibrary("MsgImpl");}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubShowMessage appMessage = new ShowMessage();appMessage.ShowMessage("with jni");}}

static块确保类加载时就被调用,loadLibrary可以加载一个动态链接库到内存,这里我们随便给个名字叫MsgImpl。在windows下动态链接库的后缀是.dll, 而linux下是.so。

ShowMessage被声明为一个本地的私有方法,我们只在java中声明它,定义放在动态库实现中。另外要注意的一点是,loadLibrary加载时并没有用完整路径,只是给了库的名字,这就要求我们要把编译好的库放在java环境的路径下(我这里是C:\Java\jdk1.5.0_22\bin)


接下来是最重要的一步,生成动态库编译所用的头文件,我们使用javah命令,如下图:


注意上图中的路径,一定要在bin这一层目录,然后-jni后面指定包名在内的全路径。我试过直接到class文件所在目录会一直报错。

命令执行成功后,会生成名为com_mess_ShowMessage.h的文件,源码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_mess_ShowMessage */#ifndef _Included_com_mess_ShowMessage#define _Included_com_mess_ShowMessage#ifdef __cplusplusextern "C" {#endif/* * Class:     com_mess_ShowMessage * Method:    ShowMessage * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_mess_ShowMessage_ShowMessage  (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif

最后,在vc下新建一个动态链接库工程,输出名为MsgImpl.dll的动态库,代码比较简单:
#include <jni.h>#include <stdio.h>#include "com_mess_ShowMessage.h"extern "C"JNIEXPORT void JNICALL Java_com_mess_ShowMessage_ShowMessage  (JNIEnv *env, jobject, jstring jMsg){printf("first output");const char* msg = env->GetStringUTFChars(jMsg, 0);printf("thingking in:%s \n", msg);env->ReleaseStringUTFChars(jMsg, msg);}

把生成的动态库放到C:\Java\jdk1.5.0_22\bin目录下,在eclipse里运行java程序,输出:


first outputthingking in:with jni 

0 0
原创粉丝点击