最近公司需要我接手JNI的工作,因此学习JNI,网上搜了好多,中文基本都是很入门很初级的资料。只有E文的资料比较具体全面。故此本人觉得有必要记笔记,然后跟大家分享。
首先从基础开始。 如果网上很容易搜到的细节的东西,我不会说那么细致,因为我懂了,而且网上可以搜到。
一 开发流程介绍:
1 编写 xxx.java 类 源文件:代码中有package的时候要小心,会导致javah生成不了的许多问题,下面详细说
1) xxx.java 的class 中包括 static { System.loadLibrary("Hello")} //Hello 为库名称
2) 在xxx.java中声明c实现的本地库中的函数 public native type_name function_name();
2 编译javac xxx.java 成 xxx.class:
这个基本类似java,简单
3 生成头文件 com_cdjlove_xxx.h :javah -jni com.cdjlove.xxx
1) 生成.h 头文件的时候会碰到很多问题,主要是由package引起的,如果package有,则xxx.class必须在package指定的路径下
然后javah 后面类型是包括package路径的。并且运行javah命令所在目录是在package指定路径外,不在其内
2) 还一种情况就是由于 classpath不对引起的,可以 -classpath=. 参数指定
4 根据com_cdjlove_xxx.h 编写c的库源代码,实现com_cdjlove_xxx.h中的头文件
5 编译.c文件为库文件
cc -fPIC -I /usr/lib/jvm/sun-jdk-1.6/include/ -I /usr/lib/jvm/sun-jdk-1.6/include/linux/ -c HelloWorld.c
ld -shared -o libHello.so -lc HelloWorld.o
7 运行java -Djava.library.path=. com.cdjlove.HelloWorld
[补充]加个图 来自《The Java™ Native Interface Programmer’s Guide and Specification》