JNI 是 Java Native Interface 的缩写,它提供了若干的 API 实现了 Java 和其他语言的通信(主要是C&C++)。从 Java1.1 开始,JNI 标准成为 java 平台的一部分,它允许 Java 代码和其他语言写的代码进行交互。JNI 一开始是为了本地已编译语言,尤其是 C 和 C++ 而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用 java 与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI 标准至少要保证本地代码能工作在任何 Java 虚拟机环境下。
package com.sweetlover.testjni; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Print(); } private native static void Print(); static { System.loadLibrary("TestJNI"); } }注意:
打开命令窗口,输入编译指令,如果编译失败,那么可能是路径问题,比如 Java 环境变量配置问题:
javah com.sweetlover.testjni.Main结束后生成了 com_sweetlover_testjni_Main.h 头文件。
在和 com_sweetlover_testjni_Main.h 头文件所在路径下创建对应的 cpp 文件,编写如下代码:
#include <jni.h> #include <cstdio> #include "com_sweetlover_testjni_Main.h" using namespace std; JNIEXPORT void JNICALL Java_com_sweetlover_testjni_Main_Print (JNIEnv *, jclass) { printf("Hello, world!\n"); }打开 VS2008 开发人员命令行工具,切换到该目录下,键入如下命令:
cl -I "%java_home%\include" -I "%java_home%\include\win32" -LD com_sweetlover_testjni_Main.cpp -FeTestJNI.dll
其中 -I 表示要 include 的目录,-Fe 后面紧跟要生成的动态库名称,因为我的 Java 代码里面要加载的动态库就是 TestJNI,得到下图则生成成功:
好了,现在把 TestJNI.dll 拷贝到 TestJNI 项目路径下,千万别错:
现在你就可以在 Eclipse 里面运行了