JNI介绍及简单实例

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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oscar999

送以玫瑰,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值