lINUX下使用JAVA的JNI

    技术2025-11-26  12

     

    这里主要讲述在LINUX(Ubuntu 10.04)下通过JNI调用底层.c文件中的函数

    以最简单的“Hello”举例

     

    第一步:

    写一个JniTest.java文件,内容如下

    public class JniTest 

    {

    static

    {

    System.loadLibrary("Hello");

    }

     

    public native void output(); 

     

    public static void main(String[] args)

    {

    System.out.println(System.getProperty("java.library.path")); 

    JniTest test = new JniTest();  

            test.output();  

    }

    }

     

    使用javac编译.java文件

    再使用javah -jni JniTest会生成一个JniTest.h的头文件,内容如下

    /* DO NOT EDIT THIS FILE - it is machine generated */

    #include <jni.h>

    /* Header for class JniTest */

     

    #ifndef _Included_JniTest

    #define _Included_JniTest

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

     * Class:     JniTest

     * Method:    output

     * Signature: ()V

     */

    JNIEXPORT void JNICALL Java_JniTest_output

      (JNIEnv *, jobject);

     

    #ifdef __cplusplus

    }

    #endif

    #endif

     

    注意:

    1.public native void output(),这个方法可以看作接口中的一个方法,只不过是由外部的其他语言(这里是C)来实现这个方法。

     

    2.静态块里的System.loadLibrary(String s)方法是根据字符串s,去java.library里去加载名为"lib" + s + ".so"的动态库文件(Windows下为dll).

    这样就可以访问native方法了。

     

    3.可以通过System.out.println(System.getProperty("java.library.path"));来获取java.library的具体路径,后面要用到。

     

    第二步:

    根据JniTest.h头文件,编写jni_test.c文件实现相应的方法

    #include <stdio.h>

    #include "JniTest.h"

    #include <jni.h>

     

    JNIEXPORT void JNICALL Java_JniTest_output(JNIEnv * jnienv, jobject job)

    {  

      printf("Hello,ZYC!/n");  

    }   

     

    然后在SHELL下将其编译成动态链接库

    $gcc -shared -I /usr/lib/jvm/java-6-sun-1.6.0.22/include/ -I /usr/lib/jvm/java-6-sun-1.6.0.22/include/linux/ -I /usr/include/ jni_test.c -o libHello.so

    gcc参数解释(可以通过man gcc查看)

    -shared 该选项指定生成动态连接库,不用该标志外部程序无法连接。相当于一个可执行文件 

    -I 包含路径,这里/usr/lib/jvm/java-6-sun-1.6.0.20/include下包含的jni.h,/usr/lib/jvm/java-6-sun-1.6.0.20/include/linux下包含的是jni-mid.h,/usr/include/包含用户的.h文件

    -o file 将内容写入file中,这里写入libHello.so

    然后就会生成libHello.so这个文件。

     

    第三步:

    执行方法:

    1.单次执行时候指定library位置

    java -Djava.library.path=. JniTest

     

    2.将通过java library来执行

    $sudo cp libHello.so /usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386/client/

    后面的路径就是通过System.out.println(System.getProperty("java.library.path"))获取到的

    然后java JniTest即可看到结果,亦可以在eclipse下使用

     

    输出结果:

    dane-zhu@dane-zhu-desktop:~/workspace/JavaJni/src$ java JniTest 

    /usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/../lib/i386:.:.:.::/usr/java/packages/lib/i386:/lib:/usr/lib

    Hello,ZYC!

     

    That'OK!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)