设为首页 加入收藏

TOP

Java中调用Delphi编写的DLL(一)
2014-11-24 03:27:08 来源: 作者: 【 】 浏览:0
Tags:Java 调用 Delphi 编写 DLL

有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成.


JNI 的教程, 网上 C 的比较多,Java 也提供了 javah.exe 为 C 语言的 JNI 程序生成头文件, 如果你是一个 Delphi 编程员, 能否让 JAVA 与 Delphi 程序交互呢 答案是肯定的,今天我们就来看一下一个简单的例子.
Helloworld. 主要是来认识一下, JAVA 怎样调用 Delphi 程序的方法.


好的,我们先来创建一个类:


package alvinJNI;


class HelloWorld {
static {
System.loadLibrary("DelphiAction"); //等一下我们就用Delphi来编一个程序,编好之后生成的文件就是 DelphiAction.dll 这是一个动态链接库文件,这个类里先在静态语句块中加载它
}


public native void printText(); //声明一个 native 的本地代码程序,我们使用的是 Delphi 来编写.注意:这个方法在这里只是声明,并没有定义方法体,因为这个方法我们要用 Delphi 来实现.


public static void main(String[] args) {
//创建对象并调用里面的 native 方法.
HelloWorld hw = new HelloWorld();
hw.printText();
}


}


类写完编译后,接下来的事情就由 Delphi 来解决了


解压之后里面有两个文件,将其存放在工程的目录下


接下来我们编写 Delphi 代码:


library DelphiAction; //这里设置动态链接库的名称,因为我们刚才写 JAVA 类时是用 DelphiAction,所以这里了要设置为 DelphiAction


{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. 这里面都是注释,是自动生成的,可以删去 }


Uses
JNI; //注意了,我们刚才下载了 JNI.pas 放在工程目录中,这里要在 Uses 里面声明,才能使用.


//下面我们来写一个函数,就是为 刚才 JAVA 类实现一个简单的方法
//因为要让 JAVA 能够调用到这个函数,所以这个函数的命名是非常讲究的,名称各段的分隔符是 _ 下划线
//本例的函数如下: 即 Java_包名_类名_类中的方法名
//函数必须设置为 stdcall
procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject); stdcall;
begin
//函数体非常简单,因为我们只是了解一下如何调用 Delphi 的函数.
Writeln('您好!看到效果了吧。');
end;


exports
Java_alvinJNI_HelloWorld_printText; //为函数做引出声明,这样才能真正的被调用到


end.


代码完成,我们 Ctrl+F9 编译 DLL
生成 DelphiAction.dll 后,我们把他复制到 Java 工程目录
注意:上面的类是打包在 alvinJNI 包中
假如我们的 Java 工程是在 C:/test
那么刚才编译后的类必须放在 c:/test/alvinJNI/HelloWorld.class
而刚刚编译完成的 DelphiAction.dll就放在 c:/test/DelphiAction.dll
然后在 C:/test 目录中执行: java alvinJNI/HelloWorld
看看你的 Java 程序调用了 DelphiAction 是怎么样的效果.


呵呵,爽吧! 今天我们才做了一点点,只学了一下如何在 JAVA 调用 Delphi 和程序,在接下来,我会贴出更多的教程,以学习一些高级一点点的 JNI 知识.


现在难得来看一下自己的博客,今天好不容易找了个代理,顺便再继续之前的话题,就是 JAVA 与 Delphi 的交互了.


在上一篇中,我们说了如何用 Java 调用 Delphi 程序的一个方法,今天我们再深入一点,就是怎样提交参数个 Delphi 的方法,以动态的控制 Delphi 的方法.
下面,我们切入正题.


首先,我们定义如下的 Java 类:


//----------------------------------------------------------------------------------------------------------
package alvinJNI;


class HelloWorld {
static {
System.loadLibrary("DelphiAction");
}


public native void printText(String str);


public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
hw.printText("您好!看到效果了吧。");
}


}
//----------------------------------------------------------------------------------------------------------


我们再像上次一样在 Delphi 中建立 DLL 工程,写下面的代码(有注释):


//----------------------------------------------------------------------------------------------------------
library DelphiAction;


uses
JNI;


//这一次我们要写的这个方法因为要接收一个 Java 传过来的参数,所以我们来说一下这个参数列表的问题
//参数列表中的第一个参数 PEnv 类型为 PJNIEnv, 它是 JNI.pas中定义的类型,我们好多工作要通过它来实现,可以把它看成是一个帮你的程序与 Java 沟通的桥梁.
//参数列表中的第一个参数 obj 类型为 JObject.前面这两个参数是固定的,这第二个参数暂时我们还不会用到.
//今天,我们还要给这个方法多加一个参数,用来接受 Java 传过来的参数. str: JString


procedure Java_alvinJNI_HelloWorld_pr

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Arm Linux LCD应用程序 For Mini2.. 下一篇Android访问php取回json数据

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)
·Linux常用命令60条( (2025-12-25 00:50:40)
·nginx 监听一个端口 (2025-12-25 00:19:30)
·整个互联网就没有一 (2025-12-25 00:19:27)