本文讲述如何使用jni技术实现helloworld,目的是让读者熟悉jni的机制并编写第一个helloworld程序。
java native interface(jni)是java语言的本地编程接口,是j2sdk的一部分。在java程序中,我们可以通过jni实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用jni来实现。
- 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
- 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
- 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们
在《java核心技术》中,作者提到jni的时候,建议不到万不得已不要使用jni技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了jni你的程序就会丧失可移植性。在本文我们跳过jni的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系如下图所示:
下面我们开始编写helloworld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用microsoft vc++工具。
- 编写java代码
我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
class helloworld
{
public native void displayhelloworld();
static {
system.loadlibrary("hello");
}
public static void main(string[] args) {
new helloworld().displayhelloworld();
}
}
注意我们的displayhelloworld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意system.loadlibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so) - 编译java代码
javac helloworld.java 生成helloworld.class文件 - 创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
javah helloworld。这样我们可以看到在相同目录下生成了一个helloworld.h文件,文件内容如下
在此我们不对他进行太多的解释。
/* 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 - 编写本地实现代码
在这部分我们要用c/c++语言实现java中定义的方法,我们在vc++中新建一个project,然后创建一个helloworldimp.cpp文件,内容如下
#include <jni.h>
#include "helloworld.h"
#include <stdio.h>
jniexport void jnicall
java_helloworld_displayhelloworld(jnienv *env, jobject obj)
{
printf("hello world!/n");
return;
}
注意我们这里include了 jni.h和刚才得到的helloworld.h文件。因此你要在vc++里面设置好,jni.h在java_home/include里面。编译通过后再生成hello.dll文件。 - 运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括helloworld.java,helloworld.class和hello.dll文件。运行java helloworld命令,则可在控制台看到hello world|
的输出了。
jni是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和native语言之间进行交互。
闽公网安备 35060202000074号