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了。。是不是很简单,有环境的话可以试试。。。

你可能感兴趣的:(Linux下jni的简单调用C程序函数)