- 浏览: 303792 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (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 1662SpringDM初步使用(二) 介绍哈官方的第二个例子 ... -
ubuntu10.04下nexus和maven的安装及配置
2012-03-14 16:14 2469前提要有jdk环境,官方下载nexus和maven,解压后创建 ... -
ubuntu10.04下eclipse的安装及配置
2012-03-14 00:01 1270从官方http://www.eclipse.org/downl ... -
Ubuntu10.04下配置java环境变量
2012-03-13 23:28 1034Ubuntu10.04默认安装了OpenJDK,但还是基于Su ... -
eclipse设置保护色
2012-03-16 09:22 9375eclipse操作界面默认颜色为白色。对于我们长期使 ... -
OSGI学习笔记(六)
2012-03-17 15:08 2723SpringDM初步使用(一) 官方地址http:// ... -
OSGI学习笔记(八)
2012-03-19 21:08 2261SpringDM初步使用(三) spring第三个例子 ... -
OSGI学习笔记(五)
2011-07-31 10:32 1556开放服务网关协议 (Open Services Gateway ... -
osgi学习笔记(三)
2011-07-16 22:43 1918OSGI实战书上讲了一个web登陆验证切换功能。表达了osgi ... -
word工具类
2011-03-15 09:19 1403package org.foreverframework ... -
命令模式--撤销恢复
2011-03-14 22:32 4934该例子来自阎宏提供的 ... -
java zip
2011-03-06 15:32 1177import java.io.BufferedInputStr ... -
doc转swf
2010-12-07 22:03 8497将doc转换成swf,然后显示在html页面上。 packa ... -
javamail简单使用
2010-11-15 08:29 2295MailInfo类: //发送邮件的信息类 public ... -
xloadtree的一个改造
2010-09-20 22:58 2532修改了xloadtree的部分源码以适合自己使用。 1.修改 ... -
java与Delphi写的dll交互
2010-09-05 22:27 6095有时候在项目开发的时候难免会和硬件提供的开发包接触,这些开发接 ... -
office工具类
2010-07-31 14:17 2280将jcom.dll放入jdk的bin目录下,将jcom.jar ... -
启动多个tomcat
2010-04-22 09:13 1174想启动多个tomcat,只需修改conf/server.xml ... -
dos 删除指定日期前的文件
2010-04-19 22:47 3410@echo off&setlocal enablede ...
相关推荐
java与dll是怎么样交互,如何自己写dll,跨语言的交互问题,代码通过测试
java和dll交互 参考文章:https://www.jianshu.com/p/7f9b6d3af297
java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后...
Java采用JNI调用VC++生成的dll(Java与C++交互)
NULL 博文链接:https://abstractforever.iteye.com/blog/756142
java调用dll(VC开发)交互混合开发实例源码,其中自带了JAVA源码以及DLL的源码,DLL采用VC开发,演示了传参、调用之间的关系,希望对你有用
在Java中调用DLL(Dynamic Link Library)文件,可以使用Java的本地方法接口(JNI,Java Native Interface)来实现。JNI允许Java程序与本地代码进行交互,从而实现跨平台的功能。
目前Java与Dll交互的技术主要有三种:JNI、JAWIN和JACOB,JNI(Java Native Interface)是SUN提供的Java与系统中的原生方法的技术。JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com...
JNI基本实现过程,快速了解java与c如何交互,为从事ndk开发迈出一步!
有jar包 还有dll文件 把jar包导入项目 把两个dll文件复制到system32下面
完整演示使用JNI开发JAVA和C++交互的例子,本示例提供了在Windows和linux上的编译脚本。请参考JNI的相关文章,如有疑问可留言
目录(导读) 一、Dalvik虚拟机工作原理介绍 二、Dalvik与Androi架构 三、JNI技术(java与dll交互的技术) 四、Dex文件结构 五、Apk文件结构、dex反编译 5.2 反编译工具Dedexer 六、JAVA虚拟机的结构解析
通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。...
java写dll接口源码(介绍)Java 本机接口编程,通过示例 注意:我现在正在考虑向本教程添加内容。 如果您有建议或新增内容,请不要犹豫。 目录 前言 注意:我在 2017 年初写了这篇文章,因为需要将图像序列化任务从 ...
在使用java 进行qt 界面开发的时候,必不可少的qt jambi 开发包。 下载压缩包后 将其中的 jar导入项目的build path。 然后,在安装了qtjambi 插件的eclipse 中的 Qt Jambi Preference Page 的 Jambi Location 处...