Java为什么要调用C语言编写的程序
因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语言去处理,然后Java调用C语言的接口。
使用Java如何去调用C语言的接口呢?
使用Java的JNI技术。
具体调用步骤
CentOS7环境下
首先创建Java文件 HelloJni.java ,并创建native方法
package com.hongyu.jni;public class HelloMyJni{ public native void helloWorld(); // 注意,这个native方法就是调用C语言接口用的 static{ System.loadLibrary(\"hello\"); // 这行是调用动态链接库 } public static void main(String[] args){ new HelloMyJni().helloWorld(); }}
编译Java文件并生成java头文件
javac -d . HelloJni.java
生成class文件
javah -jni com.hongyu.jni.HelloJni
生成java头文件 com_hongyu_jni_HelloJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_hongyu_jni_HelloJni */#ifndef _Included_com_hongyu_jni_HelloJni#define _Included_com_hongyu_jni_HelloJni#ifdef __cplusplusextern \"C\" {#endif/** Class: com_hongyu_jni_HelloJni* Method: helloWorld* Signature: ()V*/JNIEXPORT void JNICALL Java_com_hongyu_jni_HelloJni_helloWorld(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
创建C语言文件,HelloWorld.c
#include \"jni.h\"#include \"com_hongyu_jni_HelloJni.h\"#include <stdio.h>#include <stdlib.h>JNIEXPORT void JNICALL Java_com_hongyu_jni_HelloJni_helloWorld(JNIEnv * env, jobject obj){ printf(\"Hello World!\\n\");}
生成动态链接库文件 libhello.so
#gcc -Wall -fPIC -c HelloWorld.c -I ./ -I $JAVA_HOME/include/linux/ -I $JAVA_HOME/include/#gcc -Wall -rdynamic -shared -o libhello.so HelloWorld.o
设置动态链接库文件的目录
打开文件
vi ~/.bash_profile
修改文件:
export JAVA_HOME=/home/jdk1.8.0_161export PATH=$JAVA_HOME/bin:$PATHexport LD_LIBRARY_PATH=/home/lib:$LD_LIBRARY_PATH
刷新文件:
source ~/.bash_profile
把刚才生成的so文件拷贝到/home/lib下,然后执行class文件
java com.hongyu.jni.HelloJni
大功告成!Java成功调用了C语言编写的逻辑