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

Java如何调用C语言程序,JNI技术的更多相关文章

  1. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  2. Java语言与C语言混合编程(2)--在Java中调用C语言本地库

    在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...

  3. Java的native关键字---JAVA下调用其他语言的关键词

    今天研究Java基础类库,Object类的时候,发现了一个关键字:native 咦?这是个什么东东?它认识我,我可不认识它! 嘿嘿,没关系,baidu一下. java native关键字 一. 什么是 ...

  4. R语言- 实验报告 - 利用R语言脚本与Java相互调用

    一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...

  5. java jni 调用c语言函数

    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...

  6. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  7. java中调用js脚本

    JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...

  8. 在 Android 中如何调用 C 语言?

    当我们的 Java 需要调用 C 语言的时候可以通过 JNI 的方式,Java Native Interface.Android 提供了对 JNI 的支持, 因此我们在 Android 中可以使用 J ...

  9. autoit 处理文件上传弹出框,并在JAVA中调用

    Java  代码 //定义exe 文件存放的绝对路径 File file2 = new File("."); String command = file2.getCanonical ...

随机推荐

  1. Python - list 列表常见方法

    list.append(x) 介绍 在列表的末尾添加一个元素 相当于  a[len(a):] = [x] 返回值 None 栗子 # append a = [1, 2, 3] b = [4, 5, 6 ...

  2. JAVA web环境搭建(使用Tomcat8整合httpd)

    说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建Tomcat并整合httpd的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查 ...

  3. ESLint自用规则

    官方文档地址 rules: { // allow async-await 'generator-star-spacing': 'off', // allow debugger during devel ...

  4. 深入源码理解Spring整合MyBatis原理

    写在前面 聊一聊MyBatis的核心概念.Spring相关的核心内容,主要结合源码理解Spring是如何整合MyBatis的.(结合右侧目录了解吧) MyBatis相关核心概念粗略回顾 SqlSess ...

  5. java命名规则/规范

    Java命名规则: 名称只能由字母.数字.下划线.$符号组成. 不能以数字开头,不能包含空格. 名称不能使用Java中的关键字. Java命名规范: 项目名全部小写:     project 包名全部 ...

  6. SAS 常用字符串函数

    原文链接:https://www.cnblogs.com/snoopy1866/p/15085466.html CAT(item-1 <, -, item-n>) : 在保留首尾空格的情况 ...

  7. 大数据学习(24)—— Spark入门

    在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益. 在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapRedu ...

  8. Appium使用inspactor开始session报"Could not connect to server; are you sure it's running?"

    appium在使用inspactor start session时提示:Could not connect to server; are you sure it's running?如下图 解决方案为 ...

  9. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分

    ;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...

  10. springboot 中 inputStream 神秘消失之谜

    序言 最近小明接手了前同事的代码,意料之外.情理之中的遇到了坑. 为了避免掉入同一个坑两次,小明决定把这个坑记下来,并在坑前立一个大牌子,避免其他小伙伴掉进去. HTTPClient 模拟调用 为了把 ...