作者:天天写程序 | 来源:互联网 | 2023-10-12 22:37
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
java平台
1.为什么要使用jni
a.运行效率:
java属于解释型语言,源码被编译成二进制伪代码,由JAVA虚拟机解释执行。C是编译型的,直接将源码编译成机器代码.有些应用可能对性能有更高的要求,可能需要使用c/C++来完成,jni为不同语言的相互调用提供了一个桥梁。
b.硬件驱动访问:
java 属于高级语言,不能直接对硬件进行访问。有些场合需要访问特定的硬件信息,这时候就需要调用其它语言来完成。
c.已有功能的利用
系统的某些功能已经非常成熟、稳定。其他功能由java语言开发,如果需要集成那些功能,没有必须重新用java重新开发,可以采取jni方式来实现,达到功能模块的重复使用。
java刚刚推出的时候,一个很响亮的口号“一次编译,到处运行”。jni会使应用丧失跨平台的特性,天下木有免费的午餐,要得到什么,就有用什么去交换。
jni实现:
1. 编写java文件,声明native方法和 静态 SystemloadLibrary(String libname) 代码块,生成.class 文件
2. javah 编译 生成的.class 文件,生成.h头文件 (如果特别熟悉jni,可以自己编写对应的.h文件)
3. 根据.h文件,编写对应的c/c++文件,实现对应的方法。
4. 编译对应的c/c++文件,生成dll/so文件
5. 将生成dll/so文件放到程序的根目录或者系统的目录下面,执行.class文件,查看运行效果
1. package demo.jni1;
public class Print
{
static
{
System.loadLibrary("hello");
}
public native void print ();
}
2. 找到程序对应的目录,执行javah 命令,生成.h文件
javah -jni demo.jni1.Print
生成的 demo_jni1_Print.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class demo_jni1_Print */
#ifndef _Included_demo_jni1_Print
#define _Included_demo_jni1_Print
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: demo_jni1_Print
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_demo_jni1_Print_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3. 实现对应的hello.c方法,实例只是简单打印了一句话。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class demo_jni1_Print */
#ifndef _Included_demo_jni1_Print
#define _Included_demo_jni1_Print
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: demo_jni1_Print
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_demo_jni1_Print_print
(JNIEnv *, jobject)
{
printf("hello world!\n");
}
#ifdef __cplusplus
}
#endif
#endif
4. 因为在win32平台下用vc6.0编译,所以生成的是hello.dll 文件
5. 将hello.dll复制到程序的根目录下面,运行程序。
注:
编译dll可能会遇到的问题?
1.提示找不到jni.h文件?
因为vc6库中并没有这个文件,所以才会出错。
jni.h在jdk1.6.0_30\include下面,将jni.h复制到vc
对应的Microsoft Visual Studio\VC98\Include目录下
2.提示找不到jni_md.h文件?
原因和上面一样。jni_md.h在jdk1.6.0_30\include\win32目录下面
,将jni_md.h复制到Microsoft Visual Studio\VC98\Include目录下
,重新编译程序。
vc6使用
1.选择新建工程
2.新建文件