提到JNI,相信很多人都比较熟悉,在这里我只是简要介绍一下使用经验,做个小结。
JNI 全名 Java Native Interface,是Java语言的本地编程接口,是J2SDK中,我们可以在%JAVA_HOME%/include中找到<jni.h>. JNI的主要应用是能够提供Java与其他语言(c/c++)的应用接口转换。比如,在C中你定义了一个方法anymehtod(),而在你现在的工程中需要引用这个方法,这时JNI便可以轻松的为你解决这个接口的过度问题。当然,从java到C的调用也一样。下面我们以HelloWord来开始:
1)必要的准备条件
JDK(设置好环境变量),GCC for linux或windows编译器
2)
1.编写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(dll for windows and hello.so for linux)
2.编译java代码
指令
javac HelloWorld.java
生成HelloWorld.class文件
3.创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到
指令
javah HelloWorld
这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* 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
4.编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件
内容如下
#include
#include "HelloWorld.h"
#include
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|
的输出了。
3)在linux环境下指令如下
1.javac helloworld.java
2.javah helloworld.java
3.gcc -g -c -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -o helloworld.o helloworld.cpp
4.g++ -rdynamic -shared -o hello.so helloworld.o
5. ln -sf /.../.../hello.so $JAVA_HOME/jre/lib/i386/client
(注意 上面要写so的完整路径)