java调用c语言工程_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

#include

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

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值