JNI java本地接口
1.简介
JNI是Java Native Interface的缩写, 它的设计目的是:
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
2.JNI的书写步骤
编写带有native声明的方法的java类
使用javac命令编译所编写的java类
使用 javah ?jni java类名生成扩展名为h的头文件
使用C/C++ 完成本中央法
将C/C++ 编写的文件生成静态连接库
ok
1) 编写java顺序:
这里以HelloWorld为例。
代码1:
class HelloWorld {
public native void displayHelloWorld();
static {
System. loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld(). displayHelloWorld();
}
}
声明native方法:假设你想将一个方法做为一个本中央法的话, 那么你就必须声明改方法为native的, 并且不能完成。 其中方法的参数和返回值在后面讲述。
Load静态库:System. loadLibrary("hello");加载静态库(我们可以这样理解:我们的方法 displayHelloWorld()没有完成, 但是我们在下面就直接使用了, 所以必须在使用之前对它停止初始化)这里普通是以static块停止加载的。 同时需求留意的是System. loadLibrary();的参数“hello”是静态库的名字。
main()方法
2) 编译没有什么好说的了
javac HelloWorld. java
3) 生成扩展名为h的头文件
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: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
?ㄕ饫镂颐强梢哉庋?斫猓赫飧鰄文件相当于我们在java外面的接口, 这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法, 然后在我们的本中央法外面完成这个方法, 也就是说我们在编写C/C++顺序的时候所使用的方法名必须和这里的分歧)。
4) 编写本中央法
完成和由javah命令生成的头文件外面声明的方法名相反的方法。
代码2:
1 #include <jni. h>
2 #include "HelloWorld. h"
3 #include <stdio. h>
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
留意代码2中的第1行, 需求将 jni. h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入, 由于在顺序中的JNIEnv、jobject等类型都是在该头文件中定义的;另内在第2行需求将HelloWorld. h头文件引入(我是这么理解的:相当于我们在编写java顺序的时候, 完成一个接口的话需求声明才可以, 这里就是将HelloWorld. h头文件外面声明的方法加以完成。 当然不一定是这样)。 然后保管为HelloWorldImpl. c就ok 了。
5) 生成静态库
这里以在Windows 中为例, 需求生成dll文件。 在保管HelloWorldImpl. c文件夹下面, 使用VC的编译器cl成。
cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp. c -Fehello. dll
留意:生成的dll文件名在选项-Fe后面配置, 这里是hello, 由于在 HelloWorld. java文件中我们loadLibary的时候使用的名字是hello。 当然这里修正之后那里也需求修正。 另外需求将 -I%java_home%\include -I%java_home%\include\win32参数加上, 由于在第四步外面编写本中央法的时候引入了jni. h文件。
6) 运转顺序
java HelloWorld就ok。文章由 suyin.tk 口碑最好的缩阴产品 整理,收集辛苦,希望能保留出处。