学习了一下JNI,发表文章的时候不知道该选什么好了,不知道JNI应该属于那个范畴^_^。
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
(这里我们可以这样理解:这个h文件相当于我们在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。^_^
分享到:
相关推荐
一个简单的java 通过本地接口调用c++接口的实例 一看就会 很容易上手
Java本地接口(JNI)编程指南和规范.pdf
使用JNI与本地接口,并传递中文字符串。 绝对原创,转载请说明!
Java本地接口(JNI)编程指南和规范英文版翻译
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
了解jni java本地接口的相关知识以及与其相关的其他内容
Java本地接口规范 中文版 自己在做jni时经常参考这个
Java本地接口(JNI)编程指南和规范2
JNI(java native interface)java本地接口,主要为了是实现java对本地函数的调用, 通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
这本书涉及了"Java"本地接口(JNI) JNI 编程可以使用这个规范当作参考 说明书
Java Native Interface Specification (JNI)编程指南和规范 pdf版
JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够...
JNI 简介与实现.pdf,JNI是Java本地接口,是为Java编写本地方法和嵌入本地应用程序的标准的应用程序接口,这个小教程主要说明什么是JNI,以及它所需的环境和具体实现方法,生成动态链接库等内容。
主要介绍了详解Java 本地接口 JNI 使用方法的相关资料,希望通过本文大家能彻底使用JNI编程,需要的朋友可以参考下
C语言可以实现更多的底层功能,java的平台无关性使其可以移植到更多的平台上,JNI方法可以可以实现两者之间的通信
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是...
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的...
所以java提供了一些本地接口,他主要的作用是提供一个标准的方式让java程序通过虚拟机与原生代码进行交互,这也是我们平常常说的java本地接口(JNI——java native Interface)。它使得在 Java 虚拟机(VM) 内部运行...
JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是...