java通过JNI调用DLL文件
JNI简介:
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。允许Java代码和其他语言写的代码进行交互。JNI是JDK提供的一个native编程接口。JNI 允许Java程序调用其他语言编写的程序或者代码库, 比如C/C++。Java 在内存管理和性能上有一定的局限,通过JNI我们就可以利用Native程序来克服这些限制
具体示例:
写一个java调用c的加减乘除的dll文件
1、先在编辑器中写好java代码如:
package com.li.dll;/*** @author MR.li* java通过JNI调用DLL文件*/
public class JToDll {//加载DLL库的方法 System.loadLibrary()//不用指定后缀".dll"static {System.loadLibrary("Math");}//DLL库中对应的方法public native int dll_add(int a,int b); //加法public native int dll_sub(int a,int b); //减法public native int dll_mul(int a,int b); //乘法public native int dll_div(int a,int b); //除法public static void main(String[] args) {JToDll dll = new JToDll();int add = dll.dll_add(2, 3);int sub = dll.dll_sub(8, 5);int mul = dll.dll_mul(5, 6);int div = dll.dll_div(20, 4);System.out.println("add="+add+";sub="+sub+";mul="+mul+";div="+div);}/** native 关键字告诉编译器(其实是JVM)调用的是该方法在外部定义,这里指的是C。*/
}
2、对你写好的这个java进行编译成class文件,在eclipse的话可以直接拿到class文件,在这里我用cmd命令进行编译
3、使用javah命令生成c所需要的头文件
在cmd中进入到你项目所在的bin目录然后执行cmd命令,
注意:没有.class 而且 如果有包名的话 记得要把包名也写上
执行cmd命令后会在你的bin目录下生成.h的头文件
4、使用vs2017创建dll动态链接库
点击右上角文件选择新建项目
之后会有一个弹出框,选择右边的windows桌面和左边的动态链接库,下边的名称是这个dll动态链接库项目的名称、位置是这个项目的存放位置
最后点击确定就创建项目了如:
5、在C/C++项目中导入头文件
此时出了导入刚刚生成的.h文件,还需要导入java的头文件 jni.h 和jni_md.h
jni.h 以及jni_md.h的路径在 java的安装位置下的include文件夹内 以及win32下
导入顺序为先导入刚创建的项目,其次在导入编辑器中如:
如果跳过项目文件夹导入直接导入到编辑器中是会报错的,原因是在项目中找不到这个文件
6、编写程序并打包DLL库
// Math.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"#include "jni.h"
#include "jni_md.h"
#include "com_li_dll_JToDll.h"JNIEXPORT jint JNICALL Java_com_li_dll_JToDll_dll_1add(JNIEnv *, jobject, jint a, jint b) {return a + b;
}
JNIEXPORT jint JNICALL Java_com_li_dll_JToDll_dll_1sub(JNIEnv *, jobject, jint a, jint b) {return a - b;
}
JNIEXPORT jint JNICALL Java_com_li_dll_JToDll_dll_1mul(JNIEnv *, jobject, jint a, jint b) {return a * b;
}
JNIEXPORT jint JNICALL Java_com_li_dll_JToDll_dll_1div(JNIEnv *, jobject, jint a, jint b) {return a / b;
}
其中的函数直接从你生成的头文件中赋值粘贴拿过来把函数的内容自己补上就可以
注意:编译的时候有x86和x64的选择,区别是x84是32位的x64是64位的
编译时可能还报找不到jni.h的错误,可以将#include <jni.h>改为#include "jni.h",因为前者是引用系统头文件的写法
点击顶部的生成选择生成解决方案进行编译:
在底部会有编译的信息其中就有生成的dll文件路径:(这里我选择是是64位因为我的jdk是64的——根据自己需要来选择生成对应的文件)
打开文件看一下
7、将生成的dll文件放入System32下(64位放入SysWOW64下)或者放入项目文件中(访问System32下的可以跳过这一步)
我在这里直接放入项目中,新建lib文件夹将Math.dll文件放入最后右键项目build Path ->Configure Build Path->Libraries->Native library location双击编辑路径选择为项目下的lib文件夹
8、加载dll文件运行项目
注意加载时不用指定后缀".dll"
运行结果:
java与JNI数据类型对应表
JNA调用dll文件
java通过JNI调用DLL文件相关推荐
- java jni dll路径_Java中Jni调用DLL文件试验
Java中Jni调用DLL文件试验 下面是小编整理的Java中Jni调用DLL文件试验内容,希望可以为您带来帮助!更多内容请关注应届毕业生考试网! 所有文件均在E:\路径下. 安装jdk1.6.0_0 ...
- java jni调用dll文件_Java通过jni调用动态链接库
(1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...
- Java相对路径调用dll文件,VS项目中调用他人提供的.lib和.dll文件的用法(绝对路径和相对路径)...
开发平台:vs2013 他人提供的动态库文件,包含 .lib 文件和 .dll 文件 在VS的工程中常常要设置头文件的包含路径和库文件的包含路径,当然你可以使用绝对路径,但是如果你这样设置了你只 ...
- Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)
Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...
- java中调用dll文件的两种方法
https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...
- 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。
关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...
- 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat
关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat 参考文章: (1)关于j ...
- java如何利用JNative调用dll文件
下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/ 因为项目需要,用到了java调用dll文件中的方法.写 ...
- java 项目加载dll文件,Java动态调用链接库dll文件
Java动态调用链接库dll文件 Java动态调用链接库dll文件 因为项目需要,用到了java调用dll文件中的方法.写成dll文件大多是用C语言弄成的,对于我这个纯粹干java的人员来说,着实让我 ...
- Java利用JNI调用c++代码简易例子演示
点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI - - - JNI的全名为Java Native Interface(Jav ...
最新文章
- Java数组的初始化
- 深度学习训练,选择P100就对了
- 顶级项目管理工具 Top 10
- 每秒处理10万订单乐视集团支付架构--转
- “一带一路”谋定沿边开放发展-刘虹飞:经信研究形成共识
- [development][PCRE] old PCRE
- c语言程序设计第二版李学刚,C语言程序设计(第2版)李学刚教学资源教学课件2-7 动态变量.pptx...
- Eclipse中添加对Python的中文支持
- Python 读入Excel表时如何判空NaN
- linux下自己安装软件做成命令
- Mike Stout关于BOSS战的分享
- Linux IP别名,接口绑定,多网卡绑定
- Go语言中协程的概念和基本使用
- 基于java的图书管理系统(英文)
- 微信小程序 提示 provisional headers are shown
- 摩拜女员工举报前端大佬性骚扰,擅用职权打压同事!
- win10无法访问xp计算机,WinXP无法访问Win10共享文件夹,拒绝访问怎么办?
- 【重点】心田花开|人教版小学一年级语文上册汉语拼音
- XGBoost的目标函数推导和分裂增益计算
- Bootstrap carousel轮转图的使用
热门文章
- WinFlash AwdFlash分析
- Greenplum 实时数据仓库实践(5)——实时数据同步
- Message: 不允许有匹配 “[xX][mM][lL]“ 的处理指令目标解决
- flash倒计时制作
- 【Wifi密码破解】安卓手机、电脑如何破解Wifi密码
- java简易计算器程序框图_简易计算器程序设计思路及流程图
- 百度SEOdedecms织梦采集侠V2.9采集插件
- class不生效 weblogic_weblogic部署常见问题
- caj文件转pdf、QQ文件、微信视频
- 关于rtx 2009 远程控制插件 下载的问题