美文网首页@IT·互联网
java JNI(java 调用c语言程序)

java JNI(java 调用c语言程序)

作者: Jimhou | 来源:发表于2017-05-17 09:52 被阅读558次
    JNI 简介

    JNI 即Java Native Interface,说通俗点就是java端写一个nvtive方法,由更底层的语言(c/c++)实现这个native方法。


    业务需求:
      给客户部署我们的产品,需要获取主机的唯一标识,并且我们不希望把获取的这个唯一标识的相关信息暴露给客户,所以将采集主机唯一标识的代码用C开发,并编译成二进制so文件,供java调用。

    step 1:编写OsId 的类
    package com.test;
    public class OsId {
        private static final String LIBOSID = "osid";
    public native String getOsId(); //由C语言实现
    
        private static OsId instance = new OsId();
    
        private OsId() {
            System.loadLibrary(LIBOSID);  //会load libosid.so
            }
    
        public static String get() {
            return instance.getOsId();
        }
    }
    
    step 2:javac OsId.java
    step 3:javah com.test.OsId
    此处需要注意java类的包结构,需要将第二部编译好的OsId.class文件,放到com/test/ 目录下,
    然后在com的上一层目录执行javah com.test.OsId,(OsId 类的全类名)
    
    step 4:用c语言实现方法
    getinfo.c
    #include "com_test_OsId.h"
    #include <stdio.h>
    #include <string.h>
    char encode[128] = {'\0'};
    char* getEnCode(){
        FILE * fp;
        fp=popen("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","r");//获取主机唯一标识的linux命令,后续掺杂各种算法
        fgets(encode,sizeof(encode),fp);
        pclose(fp);
        
        return encode;
    }
    JNIEXPORT jstring JNICALL 
    Java_com_test_OsId_getOsId
      (JNIEnv * env, jobject obj)
    {
    //    return getinfo();
        return (*env)->NewStringUTF(env, strupr(getEnCode()));
    }
    main()
    {
        printf("%s", getEnCode());
    }
    
    step 5:编译c源码
    gcc -fPIC -shared -c  getinfo.c
    
    step 6:将打成so文件(命名规则一定是lib开头)
    gcc -fPIC -shared getinfo.o -o libosid.so
    
    step 7:将so文件放到 $JAVA_HOME/jre/lib/amd64
    step 8:java中 System.loadLibrary(osid); // 会加载 libosid
    step 9 :可以调用native方法

    参考

    相关文章

      网友评论

        本文标题:java JNI(java 调用c语言程序)

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