多平台统一管理软件接口,如何实现多平台统一管理软件接口
437
2022-06-13
因为在实现一些业务逻辑时,考虑到代码的安全性或者保证代码执行的效率,会调用C语言/C++来实现。所以,下面就来讲一下java如何调用C/C++:
第一,jni方式调用c接口。通过将c语言接口封装为jni的方式直接供java语言调用,这个可以说是最惯用的方式。
编写java代码:
package com.netease.test.model;
/**
* Created by hzjiaoguangcai on 2017/6/22.
*/
public class JniDemo {
//使用JAVAH命令生成包含native方法定义的C/C++头文件。
//该命令需要使用JDK/bin目录下javah.exe
public native void sayHello(int a,boolean b);
static { System.loadLibrary("demo"); };
/**
* @param args
*/
public static void main(String[] args) {
JniDemo jniDemo = new JniDemo();
System.out.println(System.getProperty("java.library.path"));
jniDemo.sayHello(100,false);
}
}
在java工程的com同级目录下编译执行/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java
生成com/netease/test/model/JniDemo.class 文件
然后执行/usr/lib/jvm/jdk8/bin/javah com.netease.test.model.JniDemo,
这时会在com统计目录下生成一个
com_netease_test_model_JniDemo.h的文件,内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_netease_test_model_JniDemo */
#ifndef _Included_com_netease_test_model_JniDemo
#define _Included_com_netease_test_model_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_netease_test_model_JniDemo
* Method: sayHello
* Signature: (IZ)V
*/
JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello
(JNIEnv *, jobject, jint, jboolean);
#ifdef __cplusplus
}
#endif
#endif
编写一个这个头文件的实现demo.c,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
#include
/* Header for class com_netease_test_model_JniDemo */
#include "com_netease_test_model_JniDemo.h"
/*
* Class: com_netease_test_model_JniDemo
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello
(JNIEnv *a, jobject jo, jint i, jboolean b){
printf("HelloWorld JNI %d! %d\n",i,b);
}
编译这个.c文件产生一个共享动态库,debian(32位)系统中在demo.c所在目录下执行的命令。
gcc -o libdemo.so -fPIC -shared demo.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/i386/client
这时候产生一个libdemo.so的文件,将libdemo.so复制到/usr/lib目录下。
备注:可以现根据 System.out.println(System.getProperty("java.library.path")); 的输出结果加载库所在的位置,而把libdemo.so放在响应的位置。
最后编译JniDemo.java
/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java
运行:
/usr/lib/jvm/jdk8/bin/java com/netease/test/model/JniDemo
输出
/usr/java/packages/lib/i386:/lib:/usr/lib
HelloWorld JNI 100! 0
第二,jna方式调用c接口。jna也是其中一种调用c接口的方式。使用时可以加载动态库.dll或.so,然后调用库中的接口。
第三,如果c接口很简单,可以将c接口编译为可执行程序,使用java直接调用可执行程序,也不失为一种简单快捷的方式。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~