Java如何调用C程序,JNI技术

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头文件

java -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 
/* 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 
#include 

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语言编写的逻辑

你可能感兴趣的:(Java)