java之JNI使用说明

转载请注明出处
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 stub
		ShowMessage 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 __cplusplus
extern "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 

你可能感兴趣的:(java,eclipse,jni,VC,native)