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语言编写的逻辑
Java如何调用C语言程序,JNI技术的更多相关文章
- Java动态调用脚本语言Groovy
Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- Java的native关键字---JAVA下调用其他语言的关键词
今天研究Java基础类库,Object类的时候,发现了一个关键字:native 咦?这是个什么东东?它认识我,我可不认识它! 嘿嘿,没关系,baidu一下. java native关键字 一. 什么是 ...
- R语言- 实验报告 - 利用R语言脚本与Java相互调用
一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...
- java jni 调用c语言函数
今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...
- java中调用dll文件的两种方法
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676 JNativ ...
- java中调用js脚本
JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...
- 在 Android 中如何调用 C 语言?
当我们的 Java 需要调用 C 语言的时候可以通过 JNI 的方式,Java Native Interface.Android 提供了对 JNI 的支持, 因此我们在 Android 中可以使用 J ...
- autoit 处理文件上传弹出框,并在JAVA中调用
Java 代码 //定义exe 文件存放的绝对路径 File file2 = new File("."); String command = file2.getCanonical ...
随机推荐
- Python - list 列表常见方法
list.append(x) 介绍 在列表的末尾添加一个元素 相当于 a[len(a):] = [x] 返回值 None 栗子 # append a = [1, 2, 3] b = [4, 5, 6 ...
- JAVA web环境搭建(使用Tomcat8整合httpd)
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建Tomcat并整合httpd的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查 ...
- ESLint自用规则
官方文档地址 rules: { // allow async-await 'generator-star-spacing': 'off', // allow debugger during devel ...
- 深入源码理解Spring整合MyBatis原理
写在前面 聊一聊MyBatis的核心概念.Spring相关的核心内容,主要结合源码理解Spring是如何整合MyBatis的.(结合右侧目录了解吧) MyBatis相关核心概念粗略回顾 SqlSess ...
- java命名规则/规范
Java命名规则: 名称只能由字母.数字.下划线.$符号组成. 不能以数字开头,不能包含空格. 名称不能使用Java中的关键字. Java命名规范: 项目名全部小写: project 包名全部 ...
- SAS 常用字符串函数
原文链接:https://www.cnblogs.com/snoopy1866/p/15085466.html CAT(item-1 <, -, item-n>) : 在保留首尾空格的情况 ...
- 大数据学习(24)—— Spark入门
在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益. 在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapRedu ...
- 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?如下图 解决方案为 ...
- 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分
;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 ------------------------------------ ...
- springboot 中 inputStream 神秘消失之谜
序言 最近小明接手了前同事的代码,意料之外.情理之中的遇到了坑. 为了避免掉入同一个坑两次,小明决定把这个坑记下来,并在坑前立一个大牌子,避免其他小伙伴掉进去. HTTPClient 模拟调用 为了把 ...