Linux下jni的简单调用C程序函数
开发环境:linux(Ubuntu 10.10) + JDK 1.6(网上有很多安装例子)
示例说明:利用java的jni调用本地代码的方法来实现一个打印helloworld的功能。其实在java刚出来时就已经支持了jni。这是很多人的一大误区。
主要步骤:
1.创建一个java类(IntArray.java):
2.使用javac编译该类(生成IntArray.class);
3.使用javah -jni产生头文件(生成IntArray.h);
4.使用本地代码实现头文件中定义的方法(编写IntArray.c);
5.编译生成本地动态库(生成libIntArray.so);
6.使用java运行程序。
具体实现:
一,创建一个java类(IntArray.java)
class IntArray{
private native void pri();
public static void main(String[] args){
IntArray p = new IntArray();
System.out.println("printf:" + p.pri());
}
static{
System.loadLibrary("IntArray");
}
}
注:
1,在java代码中声明本地方法必须有“native”标示符,native修饰的方法,在java代码中只作为声明存在。例如:private native void pri();
2,在调用本地方法前,必须首先装载含有该方法的本地库。如IntArray.java中所示,置于static块中,在java VM初始化一个类时,首先执行这部分代码,这可保证调用本地方法前,装载了本地库。
static{
System.loadLibrary("IntArray");
}
二,使用javac编译该类(生成IntArray.class)
javac IntArray.java
三,使用javah -jni产生头文件(生成intArray.h)
javah -jni IntArray
生成IntArray.h
/*DO NOT EDIT THIS FILE -it is machine generated*/
#include/*Header for class IntArray*/
#ifndef _Included_IntArray
#define _Included_IntArray
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_IntArray_pri(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
四,使用本地代码实现头文件定义的方法(编写IntArray.c)。
IntArray.c具体内容如下:
#include#include#include "IntArray.h"
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_IntArray_pri(JNIEnv *env, jobject obj){
printf("hello world\n");
}
#ifdef __cplusplus
}
#endif
五,编译生成本地动态库(生成libIntArray.so)
根据本地代码(IntArray.h,IntArray.c)生成本地动态库,命令如下:
gcc -I/home/zuo/java/java-1.6/include/ -I/home/zuo/java/java-1.6/include/linux/ -fPIC -shared -o libIntArray.so IntArray.c
注:
其中 -I后面的是java的include文件夹的地址,请根据您具体的java版本以及安装路径作相应的改变。。(我这里是/home/zuo/java/java-1.6/include)
-f后面的PIC表示生成的库中符号是与位置无关的。
-shared表示共享,共享库后缀名为.so。
-o libIntArray.so ,可以理解为编译后生成libIntArray.so库。
六,使用java运行程序
java -Djava.library.path=. IntArray
注: -D:设置java平台的系统属性,此时JavaVM可以再当前位置找到该库。
七,通过以上方法,得到正确运行结果:
zuo@zuo:$java IntArray
hello world.
这样,整个过程就ok了。。是不是很简单,有环境的话可以试试。。。