- 浏览: 308053 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (118)
- VS2008 (2)
- JAVA (34)
- AJAX (1)
- C# (1)
- Flex (16)
- FMS (6)
- SQLSERVER (1)
- ORACLE (1)
- Quartz (1)
- struts2 (1)
- java数据结构 (1)
- java设计模式 (3)
- JSF (0)
- web (2)
- jbpm4 (4)
- J2EE (1)
- webservice (2)
- javascript (8)
- spring (3)
- lucene (0)
- linux (9)
- ibatis (1)
- JPA (2)
- 外挂 (0)
- VB (0)
- Hibernate (1)
- OSGI (8)
- EXT (4)
- Maven (1)
- SpringSecurity (0)
- activiti (0)
- 项目开发 (0)
- 项目管理 (7)
- android (0)
- FFMPEG (1)
- C (2)
- eclipse (1)
最新评论
-
默默得守候在你的身边:
给力
java与Delphi写的dll交互 -
默默得守候在你的身边:
java与Delphi写的dll交互 -
fuguitong:
[url][url][url][url][url][url][ ...
doc转swf -
baidu_25402161:
到结束的时候一直 Can't delete processIn ...
一个请假单流程的实现(struts2.1.8+spring2.5+hibernate3集成jbpm4.3) -
lohaoo1:
nice!
java面包屑导航制作
jna官网地址:https://jna.dev.java.net/
首先写了一个用于测试的DLL文件:
FirstDLL.h头文件:
#ifdef FirstDLL_API #else #define FirstDLL_API extern "C" _declspec(dllimport) #endif typedef struct{ char* userName; int age; char* tel; }User; FirstDLL_API int GetSum(int a,int b); FirstDLL_API char* CallChar(char* a); FirstDLL_API void CallPointer(int *a); FirstDLL_API void CallPIntArray(int *a,int len); FirstDLL_API int CallStruct(User &user); FirstDLL_API int CallStructArray(User *user,int len); FirstDLL_API void CallVRef(int a,int b,int &c);
FirstDLL.cpp文件:
#define FirstDLL_API extern "C" _declspec(dllexport) #include "FirstDLL.h" #include <iostream.h> int GetSum(int a,int b) { return a+b; } char* CallChar(char* a){ return a; } int CallStruct(User &user){ user.userName = "陈均"; user.age = 22; user.tel = "8888888"; return 0; } int CallStructArray(User *user,int len){ for(int i = 0;i<len;i++) { user->userName = "陈均"; user->age = i+1; user->tel = "电话"; user++; } return 0; } void CallPointer(int *a){ *a = 5; } void CallPIntArray(int *a,int len){ for(int i = 0;i<len;i++){ *a = i+3; a++; } } void CallVRef(int a,int b,int &c){ c = a + b; }
编译后生成FirstDLL.dll文件.
测试文件FirstDLLTest:如果是Delphi写的DLL,将下面的生命改成如下格式即可
typedef int (FAR PASCAL *SetSrvProc)(int srv,int zh,int jh);
#include <iostream.h> #include <WINDOWS.H> #include <WINBASE.H> HINSTANCE first_dll = NULL; //声明结构体类型 typedef struct{ char* userName; int age; char* tel; }User; //外部dll声明 typedef int (*GetSumProc)(int a,int b); typedef int (*CallStructProc)(User &user); typedef int (*CallStructArrayProc)(User *user,int len); typedef void (*CallPointerProc)(int *a); typedef void (*CallPIntArrayProc)(int *a,int len); typedef void (*callVRefProc)(int a,int b,int &c); //结构体声明 typedef struct{ int kh;//0x0000,0x0001,0x0002,0x0003 unsigned char mu;//0x0004 short qty;// 0x0006,0x0007 int je;// 0x0008,0x0009,0x000A,0x000B int ye;// 0x000C,0x000D,0x000E,0x000F unsigned short year;//0x0010,0x0011 unsigned char month,day,hour,minute,second,ms,sd;//0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018 unsigned char jh;//0x0019 unsigned char lb;//0x001A unsigned char online;//0x001B //如果对齐设置默认8则:0x0000-0x001B共28个字节-->4倍 28 //如果对齐设置1则:0x0000-0x001A共27个字符 }PKQRCDA; void main() { User user; User array[2]; //调用外部dll的GetSum方法 first_dll = LoadLibrary("E:\\C++WORK\\FirstDLL\\Debug\\FirstDLL.dll"); if(first_dll!=NULL){ GetSumProc getSum = (GetSumProc)GetProcAddress(first_dll,"GetSum"); int result = getSum(4,5); cout<<result<<endl; CallStructProc callStruct = (CallStructProc)GetProcAddress(first_dll,"CallStruct"); result = callStruct(user); cout<<user.userName<<endl; CallStructArrayProc callStructArray = (CallStructArrayProc)GetProcAddress(first_dll,"CallStructArray"); result = callStructArray(array,2); cout<<array[0].age<<endl; CallPointerProc callPointer = (CallPointerProc)GetProcAddress(first_dll,"CallPointer"); int a = 3; callPointer(&a); cout<<a<<endl; CallPIntArrayProc calPIntArray = (CallPIntArrayProc)GetProcAddress(first_dll,"CallPIntArray"); int len = 3; int pia[20]; calPIntArray(pia,len); callVRefProc calVRef = (callVRefProc)GetProcAddress(first_dll,"CallVRef"); int c; calVRef(4,7,c); } }
以下是java测试:
IFirstDLL接口文件:
public interface IFirstDLL extends Library { //绝对路径,在开发的时候可以这样写,方便更新 IFirstDLL INSTANCE = (IFirstDLL) Native.loadLibrary("E:\\C++WORK\\FirstDLL\\Debug\\FirstDLL.dll", IFirstDLL.class); //相对路径,在不修改dll的时候可放到jdk/bin下面或者system32 //IFirstDLL INSTANCE = (IFirstDLL) Native.loadLibrary("FirstDLL", IFirstDLL.class); //下面是dll对应的接口方法声明,参数类型和返回类型要一致 //结构体声明 public static class User extends Structure{ public String userName; public int age; public String tel; } //值传递 int GetSum(int a,int b); //字符串传递 String CallChar(String a); //整形指针传递 void CallPointer(IntByReference a); //整形数组传递,c指针变量 void CallPIntArray(int []a,int len); //结构体值传递 public int CallStruct(User user); //结构体数组传递,结构体指针变量接收 public int CallStructArray(User[] user,int len); //带返回值的传递 public void CallVRef(int a,int b,IntByReference c); }
测试文件IFirstDLLTest:
public class IFirstDLLTest { public static void main(String[] args) { IFirstDLL firstDLL = IFirstDLL.INSTANCE; int a = 4; int b = 6; firstDLL.GetSum(a, b); firstDLL.CallChar("字符串内容"); IntByReference d = new IntByReference(); firstDLL.CallPointer(d); int[] e = new int[2]; firstDLL.CallPIntArray(e, e.length); User user = new User(); firstDLL.CallStruct(user); System.out.println("userName:" + user.userName+";age=" + user.age + ";tel=" + user.tel); User[]users = new User[3]; firstDLL.CallStructArray(users, users.length); IntByReference c = new IntByReference(); firstDLL.CallVRef(3, 5, c); } }
搞定了,常用的交互基本上都有了。复杂的也是这些演变出来的。
附件包含上面3个工程。
- FirstDLL_CTest_javaTest.rar (295.9 KB)
- 下载次数: 67
发表评论
-
OSGI学习
2012-03-18 18:01 0http://www.blogjava.net/zhenyu3 ... -
OSGI学习笔记(七)
2012-03-17 23:58 1696SpringDM初步使用(二) 介绍哈官方的第二个例子 ... -
ubuntu10.04下nexus和maven的安装及配置
2012-03-14 16:14 2510前提要有jdk环境,官方下载nexus和maven,解压后创建 ... -
ubuntu10.04下eclipse的安装及配置
2012-03-14 00:01 1307从官方http://www.eclipse.org/downl ... -
Ubuntu10.04下配置java环境变量
2012-03-13 23:28 1066Ubuntu10.04默认安装了OpenJDK,但还是基于Su ... -
eclipse设置保护色
2012-03-16 09:22 9414eclipse操作界面默认颜色为白色。对于我们长期使 ... -
OSGI学习笔记(六)
2012-03-17 15:08 2754SpringDM初步使用(一) 官方地址http:// ... -
OSGI学习笔记(八)
2012-03-19 21:08 2301SpringDM初步使用(三) spring第三个例子 ... -
OSGI学习笔记(五)
2011-07-31 10:32 1587开放服务网关协议 (Open Services Gateway ... -
osgi学习笔记(三)
2011-07-16 22:43 1961OSGI实战书上讲了一个web登陆验证切换功能。表达了osgi ... -
word工具类
2011-03-15 09:19 1445package org.foreverframework ... -
命令模式--撤销恢复
2011-03-14 22:32 4986该例子来自阎宏提供的 ... -
java zip
2011-03-06 15:32 1216import java.io.BufferedInputStr ... -
doc转swf
2010-12-07 22:03 8540将doc转换成swf,然后显示在html页面上。 packa ... -
javamail简单使用
2010-11-15 08:29 2350MailInfo类: //发送邮件的信息类 public ... -
xloadtree的一个改造
2010-09-20 22:58 2569修改了xloadtree的部分源码以适合自己使用。 1.修改 ... -
java与Delphi写的dll交互
2010-09-05 22:27 6163有时候在项目开发的时候难免会和硬件提供的开发包接触,这些开发接 ... -
office工具类
2010-07-31 14:17 2311将jcom.dll放入jdk的bin目录下,将jcom.jar ... -
启动多个tomcat
2010-04-22 09:13 1216想启动多个tomcat,只需修改conf/server.xml ... -
dos 删除指定日期前的文件
2010-04-19 22:47 3462@echo off&setlocal enablede ...
相关推荐
Java与DLL(动态链接库)的交互是跨平台编程中的一种常见需求,特别是在需要利用C++等原生代码的功能时。DLL是Windows操作系统中的一个重要组件,它允许不同程序共享同一块内存中的函数和数据,从而提高了系统资源的...
Java与DLL交互通常通过Java的JNI(Java Native Interface)来实现。JNI允许Java代码调用本地(非Java)代码,如C、C++或Delphi编写的DLL。以下是一些步骤和注意事项: 1. **创建Delphi DLL**: - 定义接口:在...
jawin.jar包含了Java接口,jawin.dll则是Java与DLL交互的桥梁,它实现了Java和C/C++之间的互操作性,使得Java程序员可以方便地调用DLL中的函数。 首先,我们需要理解Java与DLL交互的基本概念。在Java中,我们通常...
Java 作为跨平台的编程语言,通常不直接处理 DLL 文件,但有时为了利用特定操作系统提供的功能或调用 C/C++ 编写的库,我们需要让 Java 与 DLL 进行交互。 在 Java 中,有几种方法可以实现与 DLL 的交互: 1. **...
Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要依赖于Java Native Access (JNA) 库。...这两个jar包的使用,大大简化了Java与DLL交互的复杂性,使得这种跨语言的调用变得相对简单和安全。
标题“Java加载dll,导致Java进程内存泄露”涉及到的是Java平台与本地库(DLL)交互时可能出现的问题。在Java中,通过Java Native Interface (JNI) 可以调用C/C++编写的动态链接库(DLL),实现Java代码与本地代码的...
总的来说,msjava.dll是Windows系统与Java应用程序交互的重要组件,理解和处理与之相关的错误对于确保系统的正常运行至关重要。通过理解其作用、可能出现的问题以及解决方案,用户可以更好地维护自己的计算机系统。
java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后...
Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...
交互混合.rar”提供了一个Java与DLL(动态链接库)交互的混合开发案例,这通常发生在需要利用C/C++的高效性能或者已有的库资源,而应用主体是Java的情况下。以下是对这个实例的详细解析: 首先,Java是一种跨平台的...
随着Java版本的更新和微软与Sun Microsystems(现为Oracle)的法律争端,msjava.dll逐渐被淘汰。新版本的Java不再支持这个库,导致在现代系统上可能会出现兼容性问题,如错误提示或者程序无法正常运行。 **知识点四...
总的来说,通过Java调用DLL实现DES加密解密涉及了Java和C/C++的混合编程,需要理解JNI的工作原理,以及如何在C/C++中与DLL交互。这个过程对于那些希望在Java中利用已有的本地库功能的开发者来说是至关重要的。
- **导出函数**:在Delphi的DLL中,我们需要定义一个或多个导出函数,这些函数将作为Java与DLL交互的接口。例如,我们可以定义一个名为`SendSMS`的函数,接收必要的参数(如手机号码、短信内容等),并返回发送结果...
Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...
Java调用DLL是Java开发中一个重要的技术主题,它允许Java程序与本地操作系统API或者其他C/C++编写的动态链接库进行交互。在Java中,有多种方法可以实现这个功能,其中最常用的是Java Native Interface (JNA) 和 ...