准备工作

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相关推荐

  1. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

  2. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  3. Java调用Matlab程序

    Java调用Matlab程序_Macrocell-CSDN博客_java调用matlab

  4. Java调用C++程序实现方法

    Java调用C++程序实现方法(1) 这篇博文是自己在学习过程中,踩了很多坑之后,为了避免广大热爱编程的盆友再像我这样浪费太多时间,索性将自己的实现方法总结出来,以供大家参考.程序最终实现的是Hell ...

  5. java 调用window程序_Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...

  6. java 调用casperjs_Java程序去调用并执行shell脚本及问题总结(推荐)

    摘要: 该文章来自阿里巴巴技术协会(ATA)精选集 背景 我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发. java开发的特点就是我们可以很早地进行TDDL, ME ...

  7. java调用应用程序_java调用第三方应用程序

    1. java调用第三方应用使用 ProcessBuilder 对象来调用 例子位置: xc-service-manage-media-processor/test/TestProcessBuilde ...

  8. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  9. java 调用graphviz_java程序如何调用Graphviz

    .java可以直接调用这个类实现画图功能,但是使用这个类的前提是你的电脑已经装了GraphViz软件,你可以在http://www.graphviz.org/Gallery.php下载windows版 ...

最新文章

  1. flex伸缩布局盒模型总结
  2. 多数据中心的百万级消息服务实战
  3. 目标检测实战:4种YOLO目标检测的C++和Python两种版本实现
  4. 那些大家情有独钟的好书,以后由你来推荐!
  5. 阿里云 RTC QoS 弱网对抗之变分辨率编码
  6. SVN客户端安装及操作文档
  7. [实用技巧]如何关闭VS中烦人的reference提示
  8. 传统形态抗锯齿 2.0
  9. 毕业论文ppt的研究方法及过程计算机专业,毕业论文答辩ppt(要求和制作技巧)...
  10. 201771010112罗松《面向对象程序设计(java)》第十三周学习总结
  11. 华为数通笔记-策略路由
  12. mysql frm_mysqlfrm初步使用
  13. python苹果手机照片导入电脑_iphone照片怎么导入电脑?四种方法汇总
  14. Layui官方js正则验证手机号,邮箱,网址,日期,身份证
  15. 算法(一) 算法初步
  16. 为什么大家都说别去外包?外包公司到底能不能去?
  17. icheck结合datatable使用方法及实现全选、反选功能
  18. 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)
  19. 憨批豪的java成长日记-MYSQL数据库
  20. Go语言系列——01-HelloWorld、02-命名规范、03-变量、04-类型、05-常量、06-函数(Function)、07-包、08-if-else语句、09-循环、10-switch语句

热门文章

  1. html如何播放qsv,爱奇艺缓存的视频为qsv格式,怎么才能播放!
  2. linux中查看nfs日志,nfs服务器与日志服务器
  3. 虚拟机安装Android x86_64_magisk Xposed教程血与泪的经历
  4. 数学建模--预测类模型
  5. 使用极算GPU云的三个理由!?入门深度学习,还在自己配电脑?
  6. 防雷设计、防雷检测为什么选同为科技(TOWE)?
  7. 塑料瓶,事关身体健康
  8. 万弘杰谈贞观长歌:皇太子是狼群中的羊
  9. 小学计算机教师教科研方面,小学教师科研工作总结
  10. 设计师:设计师知识储备之设计流派(高技派、光亮派、白色派、风格派、极简主义、装饰艺术、后现代、解构主义、新现代主义 )之详细攻略