您的位置:首页 > 编程语言 > C语言/C++

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

2021-08-31 16:40 941 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: