Java如何調用C語言程序,JNI技術


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM