首页 java调用C封装的dll方法

java调用C封装的dll方法

举报
开通vip

java调用C封装的dll方法Java调用C# DLL的方法简介 关于java调用C# 封装的DLL文件的方法 第一种:java利用JNA进行调用 思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。 第二种:java利用jacob进行调用 第一种 java利用 JNA调用C# DLL 需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。 第一步:利用C#写COM组件 1、 新建一个类库项目(文件—新建—项...

java调用C封装的dll方法
Java调用C# DLL的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 简介 关于java调用C# 封装的DLL文件的方法 第一种:java利用JNA进行调用 思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。 第二种:java利用jacob进行调用 第一种 java利用 JNA调用C# DLL 需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。 第一步:利用C#写COM组件 1、 新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名 2、 生成.cs主文件 ; COMTestClass.cs 3、 右键点击工程->应用程序->程序集信息->使程序集com可见,打上勾 4、 右键点击工程->生成->为com Interop注册 打上勾 5、 设置强签名 (由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程序进行签名,即强命名密钥;) 打开Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路径。(.snk文件可以随意取,但.snk后缀名别忘记了) 在签名 标签中选中 为程序集签名,选择刚刚生成的强名称文件MyKeyFire.snk 。 6、 在“解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 资源管理器”中找到节点“Properties”打开AssemblyInfo.cs文件 如下图 7、 将[assembly: ComVisible(false)]属性改成[assembly: ComVisible(true)] 如下图 8、 编译程序,\bin\Debug目录中会生成 COMTest.dll 和COMTest.tlb文件。 第二步:利用C++进行再封装 1、 创建C++ DLL项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程序类型:DLL 2、 添加类,类名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp,然后生成项目; 3、 把第一步生成的COMTest.dll 和COMTest.tlb文件放入C++项目下的Debug文件夹下。 4、 注册COM组件: 4.1打开Visual Studio Command Prompt进入Debug目录,运行命令注册: gacutil -i  .dll全文件名;regasm .dll全文件名; 5、 编辑COMTest_Bridge.h和COMTest_Bridge.cpp文件: COMTest_Bridge.h SHAPE \* MERGEFORMAT COMTest_Bridge.cpp 注意: 1)、基本类型转换对应时。C#和java 中的String对应于C++的char*及COM组件中的_bstr_t; 2)、注意按顺序引用头文件,否则无法编译 SHAPE \* MERGEFORMAT 注意:项目启用 公共语言运行时支持(/clr),否则C++无法调用托管的C# dll。如图: 6、 重新生成项目。得到COMTest_Bridge.dll文件 第三步 java调用C++ DLL 1、 创建java项目,添加C++ DLL到项目下; 2、 添加 jna.jar包到 jdk1.6\jre\lib\ext下 3、 创建接口: ICOMTest_Bridge(名字和C++ DLL 名字一致); SHAPE \* MERGEFORMAT 4、 创建类:COMTest_Start: SHAPE \* MERGEFORMAT 第二种 java 通过Jacob调用 同第一种,需安装Visual Studio 2010 ,下载jacob.jar和jacob-1.16-M1-x86.dll() 第一步:利用C#写COM组件 (完全同第一种方法的第一步,此处省略) 第二步:java调用C++ DLL 1、 在开发环境中引入jacob.jar (解压放置于jdk_home/jre/lib/ext目录下); 2、 拷贝jacob-1.16-M1-x86.dll文件到 C:\Windows\System32目录,如果是Web应用的话还需要拷贝到jdk1. 6\bin目录(jdk安装目录下的bin目录) 3、 注册C# 生成的COM组件(COMTest.dll 、COMTest.tlb):注册方法同上第二部分的 4、 Java调用C# dll类实现: SHAPE \* MERGEFORMAT 5、 注意事项: 1)、dotnetCom = new ActiveXComponent("COMTest.COMTestClass");注意正确映射GUID,否则报错找不到映射类,解决方式:在注册 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 中查看相应类名 例如:运行->regedit-> HKEY_CLASSES_ROOT-> COMTest.COMTestClass namespace COMTest { public interface COMTestIfce { int add(int a, int b); void say( string str); bool isCOM1(string portName); }; public class COMTestClass : COMTestIfce { public int add(int a, int b) { return a + b; } public void say(string str) { Console.WriteLine(str); } public bool isCOM1(string portName) { if (portName.Equals("COM1")) { Console.WriteLine("1true"); return true; } else { Console.WriteLine("2false"); return false; } } } } // COMTest_Bridge.h #pragma once #define DLL_EXPORT extern "C" __declspec(dllexport) DLL_EXPORT int CPPadd(int a,int b); DLL_EXPORT void CPPsay(char* str); DLL_EXPORT bool isCOM1(char* portName); // COMTest_Bridge.cpp : // Dies ist die Haupt-DLL. #include "stdafx.h" #include #include < string > #include "COMTest_Bridge.h" #import "..\Debug\COMTest.tlb" using namespace std; using namespace System; using namespace COMTest; int CPPadd(int a,int b){ HRESULT com=CoInitialize(NULL); COMTestIfcePtr comTest(__uuidof(COMTestClass)); int result = comTest->add(a,b); CoUninitialize(); return result; } void CPPsay(char* str){ HRESULT com=CoInitialize(NULL); COMTestIfcePtr comTest(__uuidof(COMTestClass)); comTest->say(str); CoUninitialize(); } bool isCOM1(char* portName){ HRESULT com=CoInitialize(NULL); COMTestIfcePtr comTest(__uuidof(COMTestClass)); bool result = comTest->isCOM1(portName); CoUninitialize(); return result; } package jna; import com.sun.jna.Library; public interface ICOMTest_Bridge extends Library { int CPPadd(int a, int b); void CPPsay(String str); boolean isCOM1(String portName); } package jna; import com.sun.jna.Native; public class COMTest_Start { static int a = 5; static int b = 4; static String Str = "转告波仔:打印中文字符!"; static String portName = "COM1"; public static void main(String[] args) { ICOMTest_Bridge instance = (ICOMTest_Bridge) Native.loadLibrary( "dll/COMTest_Bridge", ICOMTest_Bridge.class); int m = instance.CPPadd(a, b); System.out.println("a + b = " + m);// 输出int的返回结果 instance.CPPsay(Str);// 输出字符串 System.out.println("instance.isCOM1(portName) " + instance.isCOM1(portName)); if (instance.isCOM1(portName)) { // 返回布尔运算 System.out.println("成功打开串口:" + portName); } else { System.out.println("打开串口:" + portName + " 失败"); } } } package jacob; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class ComTest { public static void main(String[] args) { // TODO Auto-generated method stub int a = 35; int b = 23; String info = "hello world!"; try { ActiveXComponent dotnetCom = null; dotnetCom = new ActiveXComponent("COMTest.COMTestClass"); // COMTest命名空间,COMTestCLass类名 Variant var = Dispatch.call(dotnetCom, "CPPadd", a, b); Dispatch.call(dotnetCom, "CPPsay", info);//调用say方法 String str = var.toString(); // 返回值 System.out.println("str: " + str); } catch (Exception ex) { ex.printStackTrace(); } } }
本文档为【java调用C封装的dll方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_348501
暂无简介~
格式:doc
大小:620KB
软件:Word
页数:0
分类:
上传时间:2017-06-05
浏览量:23