
JNI全名是Java Native Interface,通过JNI技术可以实现Java和其他编程语言的互相调用。这里我们使用的是Java和C的互相调用,Java提供本地接口,C实现该本地接口。
我使用的是RHEL 5,主要是为了测试一下在Linux平台下,了解JNI技术是如何实现的。通过一个HelloWorld实例,具体过程在下面讲解。
首先,实现的是Java本地接口Hello.java,代码如下所示:
class HelloWorld {public native void sayHello()
static {
System.loadLibrary("HelloWorld")
}
public static void main(String[] args) {
(new HelloWorld()).sayHello()
}
}
其中,方法声明为native,其实HelloWorld类就相当于一个接口,是为其他编程语言声明的接口。System.loadLibrary("HelloWorld")语句是一个static块,也就是在该HelloWorld类加载的时候进行执行。其中,该语句实现了加载本地的动态连接库(DLL),在Linux平台下,动态连接库文件是以.so作为扩展名的,也就是标准对象(Standard Object)。
对该本地接口类进行编译:
[root@localhost jni]# javac HelloWorld.java
接着,通过编译的HelloWorld.class文件,生成C语言的头文件,执行命令:
[root@localhost jni]# javah -jni HelloWorld
可以看到,在当前目录下生成一个HelloWorld.h文件,该文件就是C的接口文件,为使用C实现Java接口中定义的方法,可以发现在HelloWorld.h中有一个方法声明:
#ifndef __HelloWorld__#define __HelloWorld__
#include <jni.h>
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv *env, jobject)
#ifdef __cplusplus
}
#endif
#endif /* __HelloWorld__ */
然后,用C实现该方法,在HelloWorld.c文件中,代码如下:
#include <jni.h>#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_sayHello (JNIEnv *env, jobject obj) {
printf("Hello,the World!!!")
}
这里,方法签名为Java_HelloWorld_sayHello (JNIEnv *env, jobject obj),添加了形参obj,否则无法通过编译。
接下来,生成动态连接库libHelloWorld.so,执行命令:
[root@localhost jni]# gcc -fPIC -shared -o libHelloWorld.so HelloWorld.c
可以在当前目录下看到libHelloWorld.so,动态连接库文件名称以lib开头。将该文件拷贝到usr/lib目录下面,就可以测试了。
现在执行如下命令进行测试:
[root@localhost jni]# java HelloWorld
输出如下:
Hello,the World!!!
这只是一个非常简单的例子,主要是了解JNI在Linux下该如何用。在实际应用中,可能会非常复杂,并且要记住,一旦使用了JNI技术,系统的可移植性被破坏了。有些应用中,正是基于这种特性实现,比如限制软件的传播使用,保护开发商权益,等等。
一般linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装。[luowf@luoweifu ~]$ gcc -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
[luowf@luoweifu ~]$ g++ -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
如果未安装,在Linux系统链接网络的时候可通过以下命令安装开发工具集:
yum groupinstall "Development Tools"
第一个HelloWorld程序
说到程序,第一个肯定就是HelloWorld,那我们也从HelloWorld开始吧,写一个最简单的Hello程序,并编译和运行。
编写第一个程序
[luowf@luoweifu Cplusplus]$ pwd
/home/luowf/workspace/Cplusplus
//在vim中编写第一个HelloWorld程序
[luowf@luoweifu Cplusplus]$ vim HelloWorld.cpp
1 #include <iostream>
2
3 int main()
4 {
5 std::cout <<"Hello Wolrd!" <<std::endl
6 return 0
7 }
//编译程序
[luowf@luoweifu Cplusplus]$ g++ HelloWorld.cpp
[luowf@luoweifu Cplusplus]$ ls
a.out HelloWorld.cpp test1 test2
[luowf@luoweifu Cplusplus]$ ./a.out
Hello Wolrd!
[luowf@luoweifu Cplusplus]$
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)