因为在实现一些业务逻辑时,考虑到代码的安全性或者保证代码执行的效率,会调用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 <jni.h> /* 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 <jni.h> #include <stdio.h> /* 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直接调用可执行程序,也不失为一种简单快捷的方式。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9543/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料