JNI概念
JNI是Java Native Interface的缩写,中文为JAVA本地调用。
使用JNI, 可以调用用其他语言写成的库或程序, 尤其是C和C++。
好了,概念性的内容就不多介绍了, 直接进入实例
JNI实例
实例环境: Eclispe3.7 + jdk1.6 + Visual Studio 2005
基本步骤:
1. 写Java的测试类(在eclipse中)
2. 使用javah 命令,生成C头文件(命令行方式)
3. 新建C++ 的Win32项目, 导入以上生成的头文件, 完善.cpp(Visual Studio 2005中)
4. 编译生成动态链接库(.dll)文件
5. 将dll 文件拷入"java.library.path" 对应的目录中
6. 运行步骤1的java类((在eclipse中) 就能看到效果了。
完成此例子, 不一定需要安装Eclipse和VS, 只不过借助这些工具会比较方便一些。
详细步骤:
1. 写Java的测试类
public class JniTest {
static{
System.loadLibrary("jnitest");
}
public native void hello();
public static void main(String args[]){
new JniTest().hello();
}
}
可以有包名, 只不过在javah 的时候就需要加上对应的包名。
2. 使用javah 命令,生成C头文件(命令行方式)
在Eclipse 下会自动生成 JniTest.class 文件(如果没有生成,可以使用javac 命令生成)
进入.class 文件产生的目录, 运行
javah JniTest
会在此目录下产生 JniTest.h 的头文件。
3. 在VS 2005中
文件 -> 新建. 项目名称输入 jnitest
选择Visual C++ 语言--> Win32 项目
在下一步后选择 DLL 和 空项目
添加类 JniTest; 会产生 JniTest.h 和JniTest.cpp两个模板文件
使用步骤2产生的头文件替换JniTest.h; 内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniTest */
#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniTest
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JniTest_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
完善JniTest.cpp ; 内容如下
#include <stdio.h>
#include <stdlib.h>
#include "JniTest.h"
JNIEXPORT void JNICALL Java_JniTest_hello(JNIEnv * a, jobject b){
printf("HelloWorld,This is a JNI Test");
}
4.编译生成动态链接库(.dll)文件
要编译生成 .dll ; 需要使用Java的一些头文件;比如 jni.h;
工具 --> 选项
左边选项中选 项目和解决方案--> VC++ 目录 点击后添加
\jdk路径\include\win32
\jdk路径\include
这两个路径
点击 生成--> 生成解决方案
在debug 目录下就能看见生成的 jnitest.dll 文件了
特别注意: 此 dll 的生成路径可能是外层的debug 目录下
在内层的debug 路径看到的是jnitest.dll.embed.manifest 等文件
5. 将dll 文件拷入"java.library.path" 对应的目录中
可以通过
System.out.println(System.getProperty("java.library.path")); 看可以有哪些目录
一般来说,可以把dll 拷入 WINDOWS\system32 下 或是 \jdk路径\bin 目录下。
6. 运行步骤1的java类((在eclipse中) 就能到在cpp文件里打印的日志效果了~~
目前java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni技术的windows系统上的一个应用库。Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。而除了com对象外,jawin(Java/Win32 integration project)还可以win32-dll动态链接库中的方法。就功能而言:jni >> jawin>jacob,其大致的结构如下图:
jni技术体系功能结构图
就易用性而言,正好相反:jacob>jawin>>jni。