首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

J2SE综合--java通过JNI与delphi交互

http://www.oklinux.cn  2008-01-20  来源: 赛迪网 wy_win_wy  会员收藏  游客收藏  【 】 

前一段时间,我用java开发一个安装程序,适用于tomcat mysql构建的web环境。在开发的过程中碰到与写注册表,注册系统服务等问题用java本身很难解决,于是我想到用JNI。C与delphi两者开发JNI,我是从delphi转到java上来的,我选择了delphi。
用delphi开发JNI,首先从http://delphi-jedi.org 下载JNI.pas,把它加入到工程中就可以开发JNI了。
例如创建桌面快捷方式:
Delphi中的代码:
library myDll

uses
JNI,windows,ComObj,ActiveX,ShlObj,SysUtils,Registry;
//取得桌面目录
function getDesktopPath():String;
var
Reg:TRegistry;
DesktopPath:String;
begin
Reg:=TRegistry.Create;
try
Reg.RootKey:=HKEY_CURRENT_USER;
Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',False);
if Reg.ValueExists('Desktop') then DesktopPath:=Reg.ReadString('Desktop');
Result:= DesktopPath;
finally
Reg.Free;
end;
end;
//创建桌面快捷方式
procedure CreateDesktopLink(ProgramPath, ProgramArg, LinkName, Descr,IconPath: String);
var
AnObj: IUnknown;
ShellLink: IShellLink;
AFile: IPersistFile;
FileName: WideString;
LinkPath:String;
begin
LinkPath:=getDesktopPath() '\' linkName;
if UpperCase(ExtractFileExt(LinkPath))<>'.LNK' then //检查扩展名是否正确
begin
raise Exception.Create('快捷方式的扩展名必须是.lnk!');
end;
try
OleInitialize(nil);//初始化OLE库,在使用OLE函数前必须调用初始化
AnObj := CreateComObject(CLSID_ShellLink);//根据给定的ClassID生成一个COM对象,此处是快捷方式
ShellLink := AnObj as IShellLink;//强制转换为快捷方式接口
AFile := AnObj as IPersistFile;//强制转换为文件接口
//设置快捷方式属性,此处只设置了几个常用的属性
ShellLink.SetPath(PChar(ProgramPath)); // 快捷方式的目标文件,一般为可执行文件
ShellLink.SetArguments(PChar(ProgramArg));// 目标文件参数
ShellLink.SetWorkingDirectory(PChar(ExtractFilePath(ProgramPath)));//目标文件的工作目录
ShellLink.SetDescription(PChar(Descr));// 对目标文件的描述
ShellLink.SetIconLocation(PChar(IconPath),0);
FileName := LinkPath;//把文件名转换为WideString类型
AFile.Save(PWChar(FileName), False);//保存快捷方式

finally
OleUninitialize;//关闭OLE库,此函数必须与OleInitialize成对调用
end;
end;

//创建桌面快捷方式,在JNI中调用的就是这个方法
//这个过程的命名很有讲究,它以 Java 开头,用下划线将 Java 类的包名、类名和方法名连起来。这个命名方法不能有误,否则, Java 类将无法将 nativ 方法与它对应起来。同时,在 Win32 平台上,此过程的调用方式只能声明为 stdcall 。
procedure Java_com_wpd_JavaWindows_createDesktopLink(PEnv: PJNIEnv; Obj: JObject;ProgramPath,ProgramArg,LinkName,Descr,iconPath:JString);stdcall;
var
JVM:TJNIEnv;
PPath:String;
PArg:String;
LName:String;
Description:String;
IPath:String;
begin
JVM := TJNIEnv.Create(PEnv);
PPath:=JVM.UnicodeJStringToString(ProgramPath);
PArg:=JVM.UnicodeJStringToString(ProgramArg);
LName:=JVM.UnicodeJStringToString(LinkName);
Description:=JVM.UnicodeJStringToString(Descr);
IPath:=JVM.UnicodeJStringToString(IconPath);
CreateDesktopLink(PPath,PArg,LName,Description,IPath);
JVM.Free;
end;
//向java发送一个信息
function Java_com_wpd_JavaWindows_sendMessage(PEnv: PJNIEnv; Obj: JObject):JObject;stdcall;
var
JVM:TJNIEnv;
msg:JObject;
m:String;
begin
JVM := TJNIEnv.Create(PEnv);
    //*********假如发送的信息中包含中文字符,则要先要经过UTF8Encode转码,否则在java中取得时会是乱码
m:=UTF8Encode('中国人');
msg:=JVM.StringToJString(PChar(m));
result:= msg;
end;

{$R *.res}
exports
Java_com_wpd_JavaWindows_createDesktopLink,
Java_com_wpd_JavaWindows_sendMessage;
end.
把上面的编译生成myDll.dll文件,放到java能够找到的地方。
java中的代码:
package com.wpd;

public class JavaWindows {
public native void createDesktopLink(String programPath,String programArg,String linkPath,String description,String iconPath);
public native String sendMessage();
static{
System.loadLibrary("myDll");
}
public static void main(String s[]){
new JavaWindows().createDesktopLink("c:\text.exe","","测试.LNK","","c:\test.ico");
System.out.println(new JavaWindows().sendMessage());
}
}


上一篇:J2SE综合--区分eclipse中的两种JRE   下一篇:J2EE综合--Java企业系统架构选择考量


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·J2SE综合--区分eclipse中的两种JRE
·高级:使用异步Servlet扩展AJAX应用程序
·究竟什么叫面向接口编程
·J2SE综合介绍:Java本地接口工作方式初探
·浅析Spring2.0中新的Bean类型实现原理
·开发框架:AJAX 开发的两种不同的方法
·J2ME综合--JAR文件包及jar命令详解
·J2ME综合--关于J2ME中RMS的使用解析
·I/O及网络--MD5加密及Java的实现方式
·进阶-当前Java软件开发中几种认识误区
·J2ME综合--J2ME应用程序内存优化三招
·J2SE综合:浅析Java语言中两种异常的差别
·J2SE综合--高手对Java中的浮点数分析
·高级:走近JavaEE5与Glassfish应用服务器
·J2ME综合--谈谈J2ME的几个重要的功能
·基于AJAX的动态树型结构的设计与实现
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java入门:状态对象--数据库的替代者
·Java语言怎样调用外部应用程序
·Java语言深入--关于Java语言的内存泄漏
·JSP/Servlet/JSF:Servlet/JSP配置详解
·进阶-怎样使用AJAX进行WEB应用程序开发
·基础:J2ME程序开发之新手入门九大要点
·Java入门--Java语言接口与继承的本质
·JAVA进阶--如何提升JSP应用程序的效率
·对Java中四种XML解析技术之不完全测试
·编写高级 JScript应用代码
·JSP/Servlet/JSF--对标签库的深入研究
·Java入门--关于字符串分割的两种方法
  阅读排行
·使用AJAX技术实现网页无闪自动局部刷新
·快速教您Apache Tomcat SSL的配置
·Java语言深入--java调用C/C 的过程
·用JSP JavaScript打造二级级联下拉菜单
·JAVA进阶--线程运行栈信息的获取讲解
·J2SE综合--JAVA实现把汉字转化成拼音
·使用WEBWORK实现文件上传方法实例详解
·一个非常有趣的使用spring框架AOP例子
·关于java中相对路径,绝对路径问题总结
·高级:lucene全文检索应用示例及代码简
·详细讲解Struts构架中action的跳转大全
·在Weblogic上配置JMS服务的方法
·Hibernate配置文件中的映射元素详解
·对Java中四种XML解析技术之不完全测试
·在JSP环境中配置使用fckeditor详细讲解
网摘收藏: