JNI入门

作者: zjjfly | 来源:发表于2016-08-23 16:30 被阅读0次

    第一步

    新建一个java文件HelloJni.java,内容如下:

    public class HelloJni{
    
    static{
        System.loadLibrary("hellojni"); 
    }
    public static void main(String[] args){
        HelloJni helloJni = new HelloJni();
        helloJni.sayHello();
    }
    
    native void sayHello();
    }
    

    第二步

    用命令javah HelloJni生成一个头文件,内容一般如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloJni */
    
    #ifndef _Included_HelloJni
    #define _Included_HelloJni
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class:     HelloJni
    * Method:    sayHello
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_HelloJni_sayHello
        (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    第三步

    实现这个jni调用的本地方法,新建HelloJni.c,内容如下:

    #include <stdio.h>
    #include "HelloJni.h"
    
    /*该方法在HelloJni.h中声明
     JNIEXPORT和JNICALL都是JNI中的关键字
        JNIEnv对应java线程中调用的JNI环境,通过这个参数可以调用  一些JNI函数
    jobject对应当前java线程中调用本地方法的对象
    */
    JNIEXPORT void JNICALL Java_HelloJni_sayHello
    (JNIEnv * env, jobject obj)
    {
        printf("HelloJni! This is my first jni call.");
    }
    

    第四步

    把c文件和头文件编译成c动态库,命令如下:

    #mac os x 
    gcc -shared HelloJni.c -I/SystemLibraryFrameworks/JavaVM.framework/Headers -o libhellojni.dylib 
    #linux
    gcc -fPIC -D_REENTRANT -I/$JAVA_HOME/include -I/$JAVA_HOME/include/linux -shared -o libhellojni.so  HelloJni.c
    

    <font color=red>注意$JAVA_HOME要替换成jdk根目录。生成的动态库名务必以lib开头</font>

    第五步

    查询出java.library.path这个属性指向的路径,把编译出来的动态库复制到这些路径中的某一个,并用sudo chmod 777 libhellojni.so加上所以权限。

    第六步

    用javac命令编译第一步的java文件,然后用java HelloJni 运行,得到结果:

    HelloJni! This is my first jni call.
    

    相关文章

      网友评论

          本文标题:JNI入门

          本文链接:https://www.haomeiwen.com/subject/tyknsttx.html