Hello World之JNI版 (Windows环境)
雨水 2013年5月3日 转载注明出处:http://blog.csdn.net/gobitan
摘要
在Java的某些开发中可能会用到C/C++语言的一些库,尤其是语音和视频编解码领域,那么此时JNI就派上用场了。这里以Hello World来简单介绍下Windows环境下JNI开发。
第一步:编写Java的Native接口
先写一个类,该类定义了调用C的接口。具体如下:
public class HelloJNI { static { System.loadLibrary("HelloJNI"); } private native void sayHello(); public static void main(String[] args) { new HelloJNI().sayHello(); } }其中:
static部分是加载C库。sayHello()是Java的native接口。其他不过多解释。
用javac HelloJNI.java编译出HelloJNI.class文件备一下步用。
第二步:生成C头文件
执行如下命令,根据定义了native接口的Java类生成JNI头文件。
javah HelloJNI
该命令将生成如下C的头文件,其中包含了一个方法如下:
JNIEXPORT void JNICALLJava_HelloJNI_sayHello
(JNIEnv *, jobject);
注:最后这个头文件是不必要的。
第三步:编写C源文件
该C源文件实现了上一步中的接口,具体如下:
#include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *env, jobject object) { printf("Hello World, JNI!"); return ; }
第四步:编译C文件
在Windows环境下,需要将其编译成DLL库(Linux下对应为so库)。
网上有很多关于它的编译方法,很多都是基于Cygwin下的老版本的gcc,结果一些参数不支持,会报错。经过尝试和网上搜索,后面找到可以通过MinGW来编译。
先到MinGW官网http://www.mingw.org/去下载一个安装上,假设安装至C盘根目录,然后将C:\MinGW\bin加入到系统的Path环境变量中。
执行如下命令编译:
gcc -Wl,--add-stdcall-alias-I"C:\Program Files\Java\jdk1.6.0_27\include" -I"C:\ProgramFiles\Java\jdk1.6.0_27\include\win32" -shared -o HelloJNI.dll HelloJNI.c
这里需要将java的头文件路径替换为你本地的。执行成功后将在当前目录生成HelloJNI.dll文件。
第五步:最后运行
java -Djava.library.path=. HelloJNI
这里假定Dll的位置跟HelloJNI.class在同一目录,如果不在,可以通过java.library.path参数来设置。
参考资料:
1. http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html