java JNI(java 调用c语言程序),
分享于 点击 31917 次 点评:171
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方法
参考
- https://de.wikipedia.org/wiki/Java_Native_Interface
- http://www.cnblogs.com/icejoywoo/archive/2012/02/22/2363709.html
- https://en.wikipedia.org/wiki/Java_Native_Access
- http://stackoverflow.com/questions/3950635/how-to-compile-dynamic-library-for-a-jni-application-on-linux/3987567#3987567
相关文章
- 暂无相关文章
用户点评