JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
Java写接口,C/C++写实现,两者的交互利用JNI实现。
1、Java接口
package example;
public class Simple{
static {
//System.load("/root/test/Simple.so"); //也可利用此方法直接写绝对路径
System.loadLibrary( "Simple" );
}
//方法接口
public native static String HelloWorld ();
//利用main方法进行测试
public static void main(String[] args) {
System.out.println(HelloWorld ());
}
}

2、编译生成class文件
javac -d . Simple.java
生成Header文件
javah -classpath . -d . example.Simple

3、example_Simple.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */

#ifndef __example_Simple__
#define __example_Simple__

#include <jni.h>

#ifdef __cplusplus
extern "C"
{
#endif

extern JNIEXPORT jstring JNICALL Java_example_Simple_HelloWorld (JNIEnv *env, jclass);

#ifdef __cplusplus
}
#endif

#endif /* __example_Simple__ */
如果是分工合作,那么java部分到此为止,java中调用该接口的方式和调用普通JAVA接口没有任何区别,你只需把改头文件给你的搭档让他们写实现就OK啦。当然如果有兴趣,我们也可继续下面的讨论。

注意:要从 JDK下面的 include 文件夹中把 jni.h和 jni_md.h 两个文件 copy 到你的 VC 工程Include目录里(即:\jdk\include 文件夹)
4、JNI Implementation File
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
#include <stdio.h>
#include "example_Simple.h"
JNIEXPORT jstring JNICALL Java_example_Simple_HelloWorld (JNIEnv *env, jclass){
char str[] = "Hello World!";
jstring jstr;
jstr = env->NewStringUTF(str);
return jstr;
}
5、编译生成lib文件,windows下生成.dll文件,Linux下生成.so文件。
ØLinux:
生成Simple.o文件:
g++ -O0 -fPIC -c -Wall -I. -I/usr/ali/java/include -I/usr/ali/java/include/linux Simple.cpp -o Simple.o Ø Ø 生成Simple.so文件:
g++ -shared -o Simple.so Simple.o
Windows
cl -I%java_home%\include -I%java_home%\include\win32 -LD Simple.c -FeSimple.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是Simple,因为在Simple.java文 件中我们loadLibary的时候使用的名字是Simple。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在编写本地方法的时候引入了jni.h文件。
6、配置lib路径(比较麻烦)
a. 使用System.loadLibrary( name );
(1)windows下dll文件的命名可以随意,取不带后缀的文件名,例:Simple.dll,传入Simple即可。
(2)Linux下so文件的命名必须加上lib前缀, 取不带前缀和后缀的文件名,例:传入参数为Simple,则so文件名为libSimple.so。
(3)将生成的库文件copy到本机的LD_LIBRARY_PATH目录下(即配置环境变量PATH目录)。
(4)Linux下也可用export LD_LIBRARY_PATH=,设置library路径;windows下添加path路径。要注意所指引的路径应该到.so/.dll文件的上一级,如果指到.so/.dll,则会报错。
(5)Windows下直接拷贝dll到C:\WINDOWS\system32下面。
b.利用System.load(absolute path)方法,传入绝对路径找到指定文件。


7、一切配置好之后,便可进行调式了,运行命令:java Simple 运行结果:Hello World!