`
jackie9305
  • 浏览: 38257 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

java JNI调用Dll动态链接库

    博客分类:
  • JAVA
阅读更多

      由于最近项目中需要读取读卡器上的信息,从来没有接触过使用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过程中有碰到过的问题,记录一下,做个笔记,同时如果有碰到类似问题的朋友可以和我互相交流,一起学习,进步。

分享到:
评论

相关推荐

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...

    j2ee通过jni调用dll

    java通过jni调用dll动态链接库及创建dll动态链接库demo。

    Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo

    Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo 1、创建c++动态链接库,实现一些功能的封装,例如扫描设备,作为第三方库来使用 2、创建c++中间件(本质也是DLL),用来调用和进一步的封装第三方库,添加...

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。...详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    java调用动态链接库dll

    动态链接库的唯一功能就是使用Java 能够理解的C 代码来调用目标原生函数。 这个没什么实际用途的动态链接库的编写过程令人沮丧。同时编写Java 和C 代码使开 发难度大大增加。 因此,在Java 开发社区中,人们一直都视...

    java调用dll或so库示例

    完整演示使用JNI开发JAVA和C++交互的例子,本示例提供了在Windows和linux上的编译脚本。请参考JNI的相关文章,如有疑问可留言

    java调用dll文件的实例

    这是java采用jni技术调用dll(动态链接库的一个demo),不需要任何改动,自己可以用,很适合初学者

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    提供JNA4.3最新版本,简单dll,调用demo方法源码。 解压编译后即可运行

    jNativeCpp.dll动态链接库

    java调用c程序的一个工具,同样是基于JNI的,但是使用起来超级方便,比JNA、JaWin等工具更加简单,这里是相应的dll文件,还有一个我用过的例子,希望能帮助需要的人.

    JAVA调用C/C++ DLL文件方法

    JNI,JNATIVE,JAWIN 使用Java调用DLL动态链接库的方案我知道的有四种:JNI,Jnative,Jawin,Jacob

    JNI学习示例代码,含java代码工程和win32 dll工程

    JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...

    Java_JNI_编程进阶.pdf

    JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS 平台上是 DLL文件形式,在 UNIX机器上是SO 文件形式)。通过调用本地的库文件的内部方法,使 JAVA 可以实现和本地机器的紧密联系,调用系统...

    android_JNI介绍

    JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com对象外,JAWIN(JAVA/WIN32 integration project)还可以Win32-DLL动态链接库中的方法。即JNI &gt; JAWIN &gt; JACOB. JVM封装了各种操作...

    jni_example:springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu)

    jni_example springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu) 文档

    JNI文档资料源码_2020_01_22

    Java 中加载调用动态库 IX . 使用 javah 工具生成 C++ 中需要实现的 Native 方法 ( 仅做参考 ) X . 总结 ———————————————— 版权声明:本文为CSDN博主「韩曙亮」的原创文章,遵循 CC 4.0 BY-NC-...

    Java调用.dll文件的方法

    因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便

    JNI的使用实例与讲解(初学必备)

    java调用VC++编写的动态链接库dll,文档中写了三个例子,①简单的入门小例子 ②java传整型数给dll,返回整型数,③java传两个整型数,返回整型数组,每个例子都有详细的说明,帮助初学者理解JNI的使用流程和原理!...

    上期所股指期货程序交易CTP接口(Java源码+jar支持包)

    上传个自己封的java接口,源码和依赖的jar包都在压缩文件里 test目录下有行情的demo,交易部分的API还没完全做好,可以连上前置和登录 ...变更:CTP动态链接库置入jar包 变更:将JCTP相关类独立出CTP调用包

    jna包及示例和VS2010入门

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI... JNA是最新的Java平台上调用动态链接库.dll/.so的类库。是JNI终结者。

    java人脸定位.rar

    工作原理:Java加载引入JNI2OpenCV.dll动态链接库,创建对象JNIOpenCV,然后通过调用native方法detectFace,传入参数,通过人脸数据特征比对识别,进行人脸定位

Global site tag (gtag.js) - Google Analytics