JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能。使用JAVA JNI接口主要包括以下步骤:
(1)编写JAVA代码,注明要访问的本地动态连接库和本地方法;
(2)编译JAVA代码得到.class文件;
(3)使用javah -jni 生成该类对应的C语言.h文件;
(4)使用C/C++实现(3)生成的.h文件中声明的各函数;
(5)编译C/C++实现代码生成动态连接库。
本文使用一个简单的helloWorld示例演示JNI的使用。
1、编写java代码
class HelloWorld {
private static native void hello(String msg);
public static void main(String[] args) {
HelloWorld.hello("hello world!");
}
static {
System.loadLibrary("HelloWorld");
}
}
2、编译java代码
javac HelloWorld.java
3、生成实现函数的头文件
javah -jni HelloWorld
得到如下内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
4、在VC中实现函数,生成DLL文件,具体步骤如下
1、在VC的Tools\Options\Directories\Include Files增加如C:\PROGRAM FILES\JAVA\JDK1.6.0_16\INCLUDE和C:\PROGRAM FILES\JAVA\JDK1.6.0_16\INCLUDE\WIN32
2、VC创建Win32 dll工程,命名为HelloWorld
1)在stdafx.h头文件中包含#include <jni.h>,#include "HelloWorld.h"
2)在HelloWorld.cpp中实现如下代码
// HelloWorld.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
const char* strMsgPtr = env->GetStringUTFChars( jMsg , 0);
MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
env->ReleaseStringUTFChars( jMsg, strMsgPtr);
}
3)编译生成HelloWorld.dll文件
5、将HelloWorld.dll拷贝到HelloWorld.class所在的目录
6、切换到HelloWorld.class目录,运行
java HelloWorld
得到如图
本文主要是对jni技术做入门介绍,想深入可以去查看相关技术文档