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語言編寫的邏輯