Java调用C程序 —— JNative
准备工作
JNative官方主页:http://jnative.free.fr/SPIP-v1-8-3/
JNative包下载:https://sourceforge.net/projects/jnative/
需要32位GCC + 32位JDK
注意事项:
- 1.4RC3版本的JNative.jar中的lib-bin中自带了JNativeCpp.dll, 所以不需要再为JNative.jar配置JNativeCpp.dll
- JNative只支持32位的JDK, 64位的系统需要安装32位的JDK来使用JNative, 否则会报错:
java.lang.IllegalStateException: JNative library not loaded, sorry !
- 32程序Java程序调用64位gcc编译的dll动态库时,会显示找不到xxx.dll
一、编写C语言程序
mylib.h头文件(考虑了GCC和MS VC两种编译器)
#ifndef _MYLIB_H_
#define _MYLIB_H_#ifdef _MSC_VER_declspec(dllexport) int add(int a, int b);
#endif#ifdef __GNUC__int add(int a, int b);
#endif#endif
test.c文件
#include <stdio.h>
#include "mylib.h"int add(int a, int b){printf("dll function add() called\n");return (a + b);
}
二、编译成dll
这里使用MinGW来进行编译, 需要先安装MinGW
> gcc -Wall -shared mylib.c -o mylib.dll
如果使用微软的编译器cl的话, 编译命令为
> cl mylib.c /link /out:mylib.dll /dll /OPT:NOWIN98 /machine:x86
这样就获得了mylib.dll文件
三、使用JNative调用dll
Main.java文件
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;// 使用32位jdk
public class Main {public static int nativeAdd(int a, int b) throws NativeException, IllegalAccessException {JNative jNative = null;jNative = new JNative("mylib.dll", "add");jNative.setRetVal(Type.INT);jNative.setParameter(0, a);jNative.setParameter(1, b);jNative.invoke();System.out.println("返回:" + jNative.getRetVal());return Integer.parseInt(jNative.getRetVal());}public static void main(String[] args) {try {// 调用nativeAdd(1, 2);} catch (NativeException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}
}
执行命令:
> javac -cp JNative.jar Main.java
> java -classpath JNative.jar; Maindll function add() called
返回:3
附录
mingw32下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
选择离线包i686-win32-sjlj
(注:下载完mingw32之后直接编译可能提示liblto_plugin-0.dll not found,所以需要下载liblto_plugin-0.dll放在安装磁盘点的对应目录下,比如我的是 D:\mingw32\libexec\gcc\i686-w64-mingw32\8.1.0 )
jdk8u202下载,官方归档:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html
(注:oracle官网下载的jdk8u241我这安装不上,下载完点击下一步直接没反应了,不知道是不是和jdK收费有关系,目前没解决方法)
参考
- JNative入门使用--简化windows和linux调用DLL的过程
- JNative使用深入解析——基本编程
- liblto_plugin-0.dll not found错误的解决方法
Java调用C程序 —— JNative相关推荐
- eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法
linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso { static { ...
- linux下java调用matlab程序,linux_java调用windows_matlab程序
0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...
- Java调用Matlab程序
Java调用Matlab程序_Macrocell-CSDN博客_java调用matlab
- Java调用C++程序实现方法
Java调用C++程序实现方法(1) 这篇博文是自己在学习过程中,踩了很多坑之后,为了避免广大热爱编程的盆友再像我这样浪费太多时间,索性将自己的实现方法总结出来,以供大家参考.程序最终实现的是Hell ...
- java 调用window程序_Windows下Java调用可执行文件代码实例
这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...
- java 调用casperjs_Java程序去调用并执行shell脚本及问题总结(推荐)
摘要: 该文章来自阿里巴巴技术协会(ATA)精选集 背景 我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发. java开发的特点就是我们可以很早地进行TDDL, ME ...
- java调用应用程序_java调用第三方应用程序
1. java调用第三方应用使用 ProcessBuilder 对象来调用 例子位置: xc-service-manage-media-processor/test/TestProcessBuilde ...
- java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解
JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...
- java 调用graphviz_java程序如何调用Graphviz
.java可以直接调用这个类实现画图功能,但是使用这个类的前提是你的电脑已经装了GraphViz软件,你可以在http://www.graphviz.org/Gallery.php下载windows版 ...
最新文章
- flex伸缩布局盒模型总结
- 多数据中心的百万级消息服务实战
- 目标检测实战:4种YOLO目标检测的C++和Python两种版本实现
- 那些大家情有独钟的好书,以后由你来推荐!
- 阿里云 RTC QoS 弱网对抗之变分辨率编码
- SVN客户端安装及操作文档
- [实用技巧]如何关闭VS中烦人的reference提示
- 传统形态抗锯齿 2.0
- 毕业论文ppt的研究方法及过程计算机专业,毕业论文答辩ppt(要求和制作技巧)...
- 201771010112罗松《面向对象程序设计(java)》第十三周学习总结
- 华为数通笔记-策略路由
- mysql frm_mysqlfrm初步使用
- python苹果手机照片导入电脑_iphone照片怎么导入电脑?四种方法汇总
- Layui官方js正则验证手机号,邮箱,网址,日期,身份证
- 算法(一) 算法初步
- 为什么大家都说别去外包?外包公司到底能不能去?
- icheck结合datatable使用方法及实现全选、反选功能
- 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)
- 憨批豪的java成长日记-MYSQL数据库
- Go语言系列——01-HelloWorld、02-命名规范、03-变量、04-类型、05-常量、06-函数(Function)、07-包、08-if-else语句、09-循环、10-switch语句
热门文章
- html如何播放qsv,爱奇艺缓存的视频为qsv格式,怎么才能播放!
- linux中查看nfs日志,nfs服务器与日志服务器
- 虚拟机安装Android x86_64_magisk Xposed教程血与泪的经历
- 数学建模--预测类模型
- 使用极算GPU云的三个理由!?入门深度学习,还在自己配电脑?
- 防雷设计、防雷检测为什么选同为科技(TOWE)?
- 塑料瓶,事关身体健康
- 万弘杰谈贞观长歌:皇太子是狼群中的羊
- 小学计算机教师教科研方面,小学教师科研工作总结
- 设计师:设计师知识储备之设计流派(高技派、光亮派、白色派、风格派、极简主义、装饰艺术、后现代、解构主义、新现代主义 )之详细攻略