JNI技术简介
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境下。
例子:使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
任务
使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
工具
UEStudio 15,JDK1.7(32bit),VC6.0
步骤
1.使用UEStudio创建TestJNI.java,并编写以下代码:
package com.kang;
public class TestJNI
{
public native void sayHello();//native代表本地代码(即C/C++代码)
public static void main(String[] args)
{//此处代码后续补入
}
}
2.在cmd中切换到TestJNI.java所在目录,并输入:
javac -d . TestJNI.java
javah com.kang.TestJNI
此时会生成一个com文件夹和一个com_kang_TestJNI.h文件。说明成功。
3.打开VC6.0创建一个win32 dll的空工程,并新建一个名字为com_kang_TestJNI.h的头文件添加到该工程中。将TestJNI.java目录下的com_kang_TestJNI.h用记事本打开,拷贝其中的内容粘贴到VC6.0的com_kang_TestJNI.h文件中,并做如下修改:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include //将此处的尖括号改成””,这是由于jni.h不是VC6.0系统自带的头文件,这需要从外部引进
/* Header for class com_kang_TestJNI */
#ifndef _Included_com_kang_TestJNI
#define _Included_com_kang_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_kang_TestJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT voidJNICALLJava_com_kang_TestJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4.此时将需要的头文件(分别是jni.h和jni_md.h,位于Java的安装路径%JAVA_HOME%/include/和%JAVA_HOME%/include/win32)添加到VC6.0的工程目录下面。然后在VC6.0中新建一个源文件source.cpp,并添加进入如下代码:
#include "com_kang_TestJNI.h"
#include
//此处的代码要参考com_kang_TestJNI.h,要和com_kang_TestJNI.h中声明的函数一致。
JNIEXPORT voidJNICALLJava_com_kang_TestJNI_sayHello(JNIEnv * env, jobject obj)
{
printf("Hello World!\n");
}
然后编译。在工程路径中可以查看到有TestJNI.dll生成。这说明已经搞定。
5.配置环境变量:在计算机右键->属性->高级系统设置->环境变量,更改path,在原有的路径前面添加TestJNI.dll的绝对路径用分号与后面的路径分隔。在回到UEStudio中继续编辑TestJNI.java,在主函数中添加如下代码:
System.loadLibrary("TestJNI");//此处的TestJNI是刚刚在VC6.0中得到的动态链接库的名字TestJNI.dll,注意:不能带上.dll,否则系统会找不到这个动态链接库。
TestJNI tj = new TestJNI();
tj.sayHello();
6.重新打开一个cmd,切换到TestJNI.java的路径下,输入如下命令:
javac -d . TestJNI.java
java com.kang.TestJNI
会在控制台中输出Hello World!。表明已经完成。