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

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方法

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,099评论 25 709
  • _ 声明: 对原文格式以及内容做了细微的修改和美化, 主要为了方便阅读和理解 _ 一. 基础 Java Nativ...
    元亨利贞o阅读 11,199评论 0 34
  • 命题作文:对Java Native Interface (JNI) 有一个认识,使用JNI完成一个打印输出的工作。...
    Silly_N_Fool阅读 4,971评论 0 4
  • 初见你,天是蓝的,花是红的; 然而,沧桑变化, 天变灰了,花变黄了。 若只如初见,多好。
    时过夏陌阅读 1,504评论 0 2
  • 宿舍、教室、食堂三点一线的生活简单的重复,体会着不似他人口中了无生趣的高中生活,林豆、白溪溪、杜若、唐昕的生活简单...
    青禾_琳阅读 2,944评论 2 3

友情链接更多精彩内容