精华内容
下载资源
问答
  • 6、JNI代码如下图所示#include #include extern "C"JNIEXPORT jstring JNICALL Java_com_wind_myapplication_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";...

    6、JNI代码如下图所示

    #include

    #include

    extern "C"

    JNIEXPORT jstring JNICALL Java_com_wind_myapplication_MainActivity_stringFromJNI(

    JNIEnv* env,

    jobject /* this */) {

    std::string hello = "Hello from C++";

    return env->NewStringUTF(hello.c_str());

    }

    简单说一下,JNI的通信原理,主要是建立工程的时候,添加一个c或者c++的文件,里面添加本地函数,比如要调用dll的构造函数的功能,也是一样,主要是要注意方法名的写法,如

    extern "C"

    JNIEXPORT jstring JNICALL Java_com_wind_myapplication_MainActivity_stringFromJNI

    这个是有要求的,不能乱写,其实就是java的包名组成方法名就可以了,然后在java对应的类里,添加一个本地方法与该名称对应,然后加载这个DLL/so就可以了,在java方法里调用这个本地方法就会映射到jni里的方法了

    展开全文
  • Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。   Java语言本身具有跨平台性,如果通过Java调用...

    Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。

     

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。

    Java调用C/C写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题。

    使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。Jawin和 Jacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Windows的实现,使得在Windows平台下使用COM和 DLL的更加方便。

    JNI

    JNI的应用方案是基于Java类和本地函数相映射的。其使用Java调用DLL的步骤还是相对比较麻烦,不但涉及到Java编程,还涉及到C/C编程。

    JNI的使用步骤是:

    1.编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为native,其方法签名可以自定义,不用实现函数体。

    2.用Javah工具将该Java类生成对应的.h头文件。

    3.最重要的比较麻烦的一步:编写C/C代码实现.h头文件中声明的函数,该C/C代码中包含jni.h头文件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数据类型进行编程。用这种方法实现数据类型转换。例如数据类型:boolean(java) à jboolean(jni.h: typedef unsigned char jboolean),在自己编写的C/C代码中使用数据类型jboolean映射Java中的boolean类型。在该步骤中,可以在C/C代码中调用已经存在的DLL库。

    4.另外编写的Java代码时就可以使用该Java类了。

    在第3步中,编写C/C函数时,可以使用一个叫interface pointer的env指针来调用JNI提供的一系列(很多)函数,用这些函数来访问JVM的对象和数据。

    使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C比较了解。

    使用JNI的优点:可以跨平台调用本地库。

    Jawin

    Jawin的应用方案是基于函数调用时采用原始字节流传递数据的。就是在Java中指明一个DLL中的某个函数后,通过原始字节流(需要考虑参数数据类型所占的存储字节数及系统使用的字节序列)传递给该DLL函数需要的参数,其返回值也是通过原始字节流解析的方式获得正确的值。

    Jawin的使用步骤:

    1.环境配置:下载Jawin;Jawin.dll放入工程目录下;Jawin.jar相关jar文件加入到运行库中(LibPath或者Eclipse下配置工程的BuildPath-AddLibrary)。

    2.获得函数指针:new FuncPtr("DllFileName.DLL", "dllFunctionName");

    3.用LittleEndianOutputStream将函数需要的参数写入到一个原始字节流NakedByteStream。

    4.最重要的一步:调用FuncPtr.invoke()。传入参数比较复杂。

    5.解析上一步的返回值(字节数组)。

    第4步中传入的参数包括:

    1.指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:

    函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。

    其指令字符串为:IIP16G:I4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。

    其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。

    2.传入参数的总字节大小。

    3.前面写好的传入参数的原始字节流。

    4.一个object数组。

    5.ReturnFlags,用以根据C/C返回值将C/C的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和 SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。

    使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的转换比较了解;不能跨平台,对Windows的依赖性比较强。

    使用Jawin的优点:方便使用,不用进行C/C开发,不用对原始DLL进行封装就可以方便使用。

    Jacob

    Jacob是Java-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平台依赖性,但是网上有人反映其易用性不如jawin。

    展开全文
  • java jna 调用DLL

    2017-03-03 17:21:26
    今天项目上碰到要用Java调用DLL的场景,网上的文章也比较多了,但是自己参照网上的文章来做,却老是报错,最终试了好几个网上的例子,才遇到一个跑得起来的。在搜索文章尝试的时候,就决定,如果搞出来了,一定要写...
    前言
    
    今天项目上碰到要用Java调用DLL的场景,网上的文章也比较多了,但是自己参照网上的文章来做,却老是报错,最终试了好几个网上的例子,才遇到一个跑得起来的。在搜索文章尝试的时候,就决定,如果搞出来了,一定要写片文章来记录一下过程,由于跨了两种语言,所以,文章尽量傻瓜化,尽量做到demo下载后就能用,这就是这篇博文的由来。
    在java调用DLL场景中,一般采用采用jna框架调用,关于jna的具体概念大家自行搜索一下,我自己也一知半解,总之就是一种跨语言调用的工具。

    本文涉及到的环境是:win7 64位/MyEclipse 6.5/JDK1.6/VS2010(可选,用来新建DLL因为一般都已经有DLL用来调用了,这里只是为了演示)

    需要的资源:jna.jar


    本文分以下三部分
    一.在VS2010新建一个供调用的DLL
    二.在MyEclipse中新建一个JAVA项目并调用DLL
    三.总结
    ----------------------------------------------------------------------------------------------
    一、在VS2010新建一个DLL
    为了先把调用DLL环境搭好,新建一个简单的DLL是一个比较好的方案,这样可以减少复杂DLL各种引用关系给调试带来的难度,保证调用环境OK.
    (1)在VS新建一个解决方案和项目,这里命名为demo,语言选择Visual C++ 框架选择Win32控制台应用,点击确定
    java  jna 调用DLL - 安索 - 安索的博客

    (2)点击下一步
    java  jna 调用DLL - 安索 - 安索的博客

    (3)应用程序类型选择DLL,附加选项选择空项目
    java  jna 调用DLL - 安索 - 安索的博客

    (4)分别新建头文件和源文件(代码源自下文地址的博客)
    java  jna 调用DLL - 安索 - 安索的博客
    javaCallCpp.h代码清单

    extern "C" _declspec(dllexport) void hello(); extern "C" _declspec(dllexport) int add(int first, int second);

    javaCallCpp.cpp代码清单

    #include "javaCallCpp.h" #include <iostream> int add(int a, int b){ return a+b; } void hello() { printf("Hello World!\n"); }


     

    (5)点击完成,然后鼠标右键点击项目demo,选择生成,会发现项目报错,如下
    java  jna 调用DLL - 安索 - 安索的博客
     
    (6)要解决这个问题,鼠标右键点击项目demo,选择属性
    java  jna 调用DLL - 安索 - 安索的博客

    (7)如下图,将嵌入清单选项置为否,重新生成后,项目就顺利生成了。
    java  jna 调用DLL - 安索 - 安索的博客
     
     (8)现在要找到我们生成的DLL,在demo右键选择在Windows资源管理器中打开文件夹
    java  jna 调用DLL - 安索 - 安索的博客

    (9)默认进入工作空间,以本机为例E:\CODE\VS2010\demo\demo,第一个demo是解决方案名,第二个demo是项目项目名,点击上一目录进入解决方案名文件夹
     java  jna 调用DLL - 安索 - 安索的博客
    (10)单击文件夹下Debug,就看到我们需要的demo.dll,我们第一部分工作就算完成了

      java  jna 调用DLL - 安索 - 安索的博客


    二、新建JAVA项目并调用DLL

    (1)在MyEclipse中File->New->Java Project
    java  jna 调用DLL - 安索 - 安索的博客

    (2)project名为jna,注意选择jre为1.6,如果是1.7会报一个奇怪的错误,后面会介绍
     java  jna 调用DLL - 安索 - 安索的博客

    (3)点击完成后项目右键Build Path->Configure Build Path,配置jna
    java  jna 调用DLL - 安索 - 安索的博客

    (4)在Libraries选项卡选择Add External JARs,然后选择你下载的jna.jar
    java  jna 调用DLL - 安索 - 安索的博客

    (5)将第一步生成的demo.dll放到项目目录下,可以复制dell,然后选择我们的项目jna,右键粘帖,注意要放在项目的根目录下,如下图
    java  jna 调用DLL - 安索 - 安索的博客

    (6)在com.aaron.demo下新建接口JavaCallCppService.java,新建测试类Test.java
    JavaCallCppService.java代码清单

    package com.aaron.demo; import com.sun.jna.Library; import com.sun.jna.Native; public interface JavaCallCppService extends Library { //javaCallCpp.dll 放到工程目录下才行(与.classpath一级),原文注释写到也可以放到C:\WINDOWS\system32下,但我放到system32下运行项目,依然会报错 JavaCallCppService INSTANCE = (JavaCallCppService)Native.loadLibrary("demo", JavaCallCppService.class); public int add(int a, int b); public void hello(); }

    Test.java代码清单

    package com.aaron.demo; public class JavaCallCppTest { public static void main(String[] args) { System.out.println(JavaCallCppService.INSTANCE.add(1,2)); JavaCallCppService.INSTANCE.hello(); } }


    (7)在JavaCallCppTest中右键Run as->Java Application,然后就可以看到控制台的结果,如果你看到如下的控制台结果,那么恭喜你!在Java平台采用jna调用DLL的环境就已经搭建成功了!
    java  jna 调用DLL - 安索 - 安索的博客
     
     
     三、总结
    整个过程其实比较简单,但我在完成这个过程的过程中,程序总是报错,类似如下

    Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'demo': ???????¨ at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:145) at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:188) at com.sun.jna.Library$Handler.<init>(Library.java:123) at com.sun.jna.Native.loadLibrary(Native.java:255) at com.sun.jna.Native.loadLibrary(Native.java:241) at com.aaron.demo.JavaCallCppService.<clinit>(JavaCallCppService.java:7) at com.aaron.demo.JavaCallCppTest.main(JavaCallCppTest.java:5)

    换了几个不同博文的demo,直到最后在http://ynp.iteye.com/blog/2183118博客中,在下载的demo里面发现他采用的jre是1.6的,而我Myeclipse默认采用的jre7,终于恍然大悟。还没在网上遇到说报这个错误是因为jre引起的,这种坑爹的错,不多看几个例子真是难以发现!这也是我觉得先采用一个简单的dll文件来保证调用过程没问题,再开始调用实际用的dll的原因,因为我们得首先保证调用过程没问题,才可以开始怀疑是不是dll本身的问题。
     
    ----------------
    主要参考博客: http://ynp.iteye.com/blog/2183118
    java项目:http://vdisk.weibo.com/s/zw9HJxea93b1l
    C++文件:http://vdisk.weibo.com/s/zw9HJxea93bMq
    展开全文
  • Java 调用Dll

    2016-02-23 18:54:00
    Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样。 这个程序是java调用dll中的求和函数。 一,java代码部分操作 1.新建project 2....

    Java 中怎么能调用到dll中的函数呢?

    关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样。


    这个程序是java中调用dll中的求和函数。


    一,java代码部分操作


    1.新建project


    2.DllTest.java代码

    package com.aizizai.calldll;
    
    public class DllTest {
    
    	static {
    
    		System.loadLibrary("hellodll");
    	}
    
    	public static native int sum(int a, int b);
    
    	public static void main(String[] args) {
    		System.out.println("sum(2,5) = " + sum(2, 5));
    	}
    
    }
    

    3. 生成头文件

    Java调用dll測试\src>javac com/aizizai/calldll/DllTest.java
    Java调用dll測试\src>javah com.aizizai.calldll.DllTest
    


    二,VC利用前面的头文件生成dll。本文使用的是vs2010。


    1. 创建项目

    新建项目--> vc++ --> win32项目 --> 命名为hellodll -->应用程序类型:dll -->ok。

    2. 加入头文件

    a. 把

    /jdk/include/jni.h

    /jdk/include/win32/jawt_md.h

    /jdk/include/win32/jni_md.h

    拷到项目文件夹下或者Vs的include文件夹下。

    b. stdafx.h中加入

    #include "com_aizizai_calldll_DllTest.h"

    3. 在源文件里加入函数实现

    // hellodll.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    
    JNIEXPORT jint JNICALL Java_com_aizizai_calldll_DllTest_sum
    	(JNIEnv *env, jclass ss, jint a, jint b){
    		return a+b;
    }
    

    4. 生成dll

    生成 ---> 生成dll。

    就可以在项目的Debug文件夹下看到。hellodll.dll文件


    三,使用

    把dll文件拷到 c:\windows文件夹下,执行java程序。ok。



    程序下载地址:http://download.csdn.net/detail/u012587637/8065041










    转载于:https://www.cnblogs.com/blfshiye/p/5210952.html

    展开全文
  • Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。 Java语言本身具有跨平台性,如果通过Java调用DLL的技术...
  • 感谢@stagebo的这篇 https://www.cnblogs.com/wyongbo/p/jnaTest.html下面是按着这篇教程一步步来所遇到的坑以及事后的总结:一:Java直接调C#,解决办法是通过C++调用C#,流程: Java的JNI/JNA --> C++的DLL...
  • java调用dll

    2019-10-01 13:27:08
    <1> :***********************************************************************...Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 ...
  • Java 调用dll

    千次阅读 2012-11-18 15:36:21
    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数...
  • java 怎么调用DLL文件

    2008-06-06 09:28:06
    请问各位大哥,JAVA怎么调用由VFP生成的DLL文件,我查询了好多资料,都是有关JAVA调用由C/C++的DLL文件! 但一直都搞不懂怎么调用VFP的DLL文件,麻烦那位大哥能够个详细的介绍!谢谢了! [b]问题补充:[/b] ...
  • java如何调用dll

    2012-03-21 23:22:41
    jni这个东西比较复杂 因为前几天自己刚好做过这个么...假设现在有个A.dll里面有个方法叫做int add(int a, int b)现在就是要用jni去调用它 这里附上A.dll里面的代码(自己瞎个的吧 用就行) C/C++ code #in
  • java调用dll详解.rar

    2020-02-28 10:58:01
    该资源详细介绍了java调用dll方法和里面需要注意的一下注意事项,希望这个资源帮助到大家,大家共同学习进步!
  • Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递...
  •  Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数...
  • java调用dll方法

    2011-06-02 21:56:04
    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数...
  • JNI这个东西比较复杂 因为前几天自己刚好做过这...)假设现在有个A.dll里面有个方法叫做int add(int a, int b)现在就是要用jni去调用它这里附上A.dll里面的代码(自己瞎个的吧 用就行)C/C++ code#include"stdafx.h"...
  • java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异。  Java...
  • 下面是我写的调用DLL的部分代码:class GetValue{ public native String getCalcValue(String strSoftware,int iType,String strIndata); static { System.out.println("静态代码快"); ...
  • JAVA调用dll方法

    2009-06-23 15:45:47
    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在...
  • Java 调用 .net Dll笔记

    2019-03-20 17:09:49
    所以就有了这样的需求 java调用dll。 网上的资料N多,找了两天。最后感觉用jna比较方便 也灵活。但是按照网上的配置做dll调用的时候报各种错误,找不到方法程序等等。问题汇总如下: 首先 jna是不直接调用.net...
  • Java调用DLL的技术

    2012-10-26 17:38:24
    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。 Java调用C/C++写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数...
  • 本文采用JNA调用DLL note:个人尝试过JNI,Jnative,等其他调用方式.总而言之 繁琐,不适合Java吧.或者不适合小编,这里只推荐JNA,核心代码三行搞定调用DLL. jnative好用,但是文件路径等等还是有问题,不java一样去...
  • java 调用.dll组件

    2018-09-01 16:27:47
    这几天同事调用.dll文件出现各种问题, 在下闲来无事,也来玩玩,碰到的问题做个记录,指不定哪天就用上,休洛洛洛~ java调用.dll组件几种方式(JNI&amp;JNATIVE&amp;JNA) JNI JNI不要额外导入jar包...
  • 那么目前仍热火朝天的Java能能调用dll库,使用其中的方法呢?当然是可以的,但是相对于python来讲是稍微有一点困难。 那么Java是怎么调用dll动态链接库的呢? 大概分为以下几步: 1.创建Java类,在该类中加载dll...
  • 而且有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不直接使用java程序通过端口和设备通信,这种情况下就得考虑使用java程序去调用比较擅长同系统打交道的第三方程序,从1.1版本开始的JDK提供了解决这个...
  • JAVA的跨平台的特性深受java程序员们的...而且有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不直接使用java程序通过端口和设备通信,这种情况下就得考虑使用java程序去调用比较擅长同系统打交道的第三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 432
精华内容 172
关键字:

java能调用dll

java 订阅