由于最近项目中需要读取读卡器上的信息,从来没有接触过使用java调用底层动态链接库Dll的这些东西,就到网上搜了一大堆的资料,然后慢慢摸索,学习了JNI和Jnative两种通过Java方式调用Dll文件的方法。
JNI的步骤如下:
1.在java类中先定义了一个方法,不用实现。
public native static int add(int a,int b);//函数声明
如果对native用法不清楚的,可以去google看看,相信就很清楚了。
2.在java类中载入dll文件,dll文件不用扩展名,会自动识别。还有一种方法是用System.load(xxx);里面是需要绝对路径的,扩展名也不能省。
static
{
System.loadLibrary("TestDll");//载入dll
}
3. java类写好后用javac xxx.java进行编译
4. 使用javah -jni xxx.生成头文件。
第3.4点需要注意的是:一般我们都是在做项目,java类前面的包名肯定少不了,所以我们在命令行中编译时需要cd 到指定的java类路径下,例如我在Myeclipse中建立的一个工程,路径如下:D:\workspace\DiskNumber\src\com\tjn\test 先要cd
D:\workspace\DiskNumber\src\com\tjn\test 然后运行javac TestDll.java 生成class文件后,需要生成头文件,输入
set classpath=D:\workspace\DiskNumber\src ,到项目的src根目录下,然后运行javah -jni com.tjn.test.TestDll,会生成一个
com_tjn_test_TestDll.h的文件,然后改头文件的名,我这里改为TestDll.h,需要和System.loadLibrary()中的名称相对应。如果不在项目里,单个文件运行当然没问题。但是在项目中生成头文件,需要如上进行操作,否则会报找不到类的错误。
5.可以看到生成的头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tjn_test_TestDll */
#ifndef _Included_com_tjn_test_TestDll
#define _Included_com_tjn_test_TestDll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_tjn_test_TestDll
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_tjn_test_TestDll_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
这是javah根据java类自动生成的头文件,注释我们不管,可以看到里面的方法命名是Java_包名_类名_方法名,需要传递两个int类型的参数,在这个头文件中已经自动转换成jint类型。这个方法也没有任何的实现,相当于java中的接口,我们现在创建一个xx.c的文件来实现这里定义的方法。
JNIEXPORT jint JNICALL Java_com_tjn_test_TestDll_add
(JNIEnv *, jclass, jint x, jint y)
{
return x+y;
}
如何编译生成dll,这里就不加详述了。我这个例子是用vc++6.0做的.将生成的TestDll.dll文件放置到windows/system32中,然后在java类中调用就可以啦。
6.在java类的main函数中打印输出dll计算显示的返回结果
public static void main(String[] args) {
int r = TestDll.add(30,20);
System.out.println("result = "+r);
}
这里需要注意的是由于是用javah -jni 生成的头文件包含了包名,(从头文件生成的方法名就可以看出来),将这个Java类放置到其他路径下并能调用相应的dll文件,因为该dll文件只认定那个src路径下的com.tjn.test.TestDll类。所以在其他地方或者其他工程引用的话,需要将TestDll类打成jar包,在别的工程导入这个jar包,并做如下调用:
比如我在另外一个工程中的类main函数中调用
public static void main(String[] args) {
int a=com.tjn.test.TestDll.add(20, 50);
System.out.println(a);
}
调用jar包里面的方法,这是这个类就还在这个com.tjn.test的路径下,所以就不会报说找不到dll的异常啦!
JNative调用dll文件比JNI简单的多,改天整理后再说吧!也可以自己网上搜索,资料都差不多。
给个参考资料http://blog.csdn.net/pengchua/archive/2008/06/11/2534842.aspx
学习过程中的一些参考的相关资料:
1. http://www.blogjava.net/orangewhy/archive/2007/05/
2.http://www.iteye.com/topic/304594
3.http://yinxu.iteye.com/blog/206163
4.http://read.newbooks.com.cn/info/143806.html
以上这些是我在学习JNI过程中有碰到过的问题,记录一下,做个笔记,同时如果有碰到类似问题的朋友可以和我互相交流,一起学习,进步。
分享到:
相关推荐
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
在某些场景下,比如调用操作系统特定的功能或者利用已有的C/C++库,我们需要使用JNI来实现Java与本地代码(如DLL动态链接库)的交互。本教程将详细介绍如何通过JNI在Java中调用DLL的完整步骤。 1. **创建Java类和...
在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...
使用`System.loadLibrary`加载C++编译生成的动态链接库,然后就可以在Java代码中调用本地方法,间接实现对C# DLL的调用。 7. **测试与调试**: 创建一个简单的Java应用程序来调用这些本地方法,测试C# DLL的功能...
Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...
本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...
本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...
### JNI调用C++动态链接库入门:详细解析与实践指南 #### 一、引言 ...通过以上步骤,你已经完成了使用JNI调用C++动态链接库的全过程,这不仅加深了你对JNI的理解,也为今后开发高性能的Java应用奠定了基础。
Java 使用 JNI(Java Native Interface)调用 C++动态链接库是一种常见的技术,它允许 Java 代码与本地 C 或 C++代码交互,以利用 C++的高性能特性或利用已有的 C++库。以下是对标题和描述中涉及的知识点的详细解释...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
在这个场景中,我们需要通过JNI来调用IC卡读卡器的DLL(动态链接库),该DLL可能是由非Java语言编写的,以实现与IC卡的通信。 首先,我们需要理解DLL的作用。DLL文件是Windows操作系统中的一个可执行文件,其中包含...
通过JNI,Java程序可以调用C/C++编写的动态链接库(DLL),实现对系统级别的操作。 在Windows操作系统中,DLL(Dynamic Link Library)是包含可由多个程序同时使用的函数和资源的库。在本案例中,`registerHK.dll`...
JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...
### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...
Java连接调用DLL动态库是将Java编程语言与Windows平台上的动态链接库(DLL)集成的一种技术。在Java中,这种功能通常是通过JNI(Java Native Interface)实现的,它允许Java代码调用C、C++等本地代码,而DLL正是这些...
JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接库(DLL)。下面将详细介绍这个过程,包括基本概念、步骤以及在处理复杂类型如结构体和指针时的注意事项。 1. **JNI基础知识**: -...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo 1、创建c++动态链接库,实现一些功能的封装,例如扫描设备,作为第三方库来使用 2、创建c++中间件(本质也是DLL),用来调用和进一步的封装第三方库,添加...
Java 调用DLL(动态链接库)主要是通过JNI(Java Native Interface)技术来实现的。JNI是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。在本例中,我们将详细介绍如何使用JNI调用C或C++编写的DLL...