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 __cplusplus extern "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_161 export PATH=$JAVA_HOME/bin:$PATH export LD_LIBRARY_PATH=/home/lib:$LD_LIBRARY_PATH
刷新文件:
source ~/.bash_profile
把剛才生成的so文件拷貝到/home/lib下,然后執行class文件
java com.hongyu.jni.HelloJni
大功告成!Java成功調用了C語言編寫的邏輯
