`

Java与delphi动态链接库的数据交互(一)

 
阅读更多

本次学习的主要内容:

1、java给delphi传递一个String类型的参数,由delphi打印出来;

2、delphi返回一个int类型的结果给java;

3、java调用delphi显示一个最简单的窗体。

—————————————————————————————————————————————————————————————————————————————

1、准备工作:

下载大神编写的delphi和java 数据互通的delphi单元文件:JNI.pas,下载地址:http://www.blogjava.net/Files/alvin/jni_pas.zip

注:由于我用的delphi xe版本,而最新的JNI.pas据说可以在http://www.delphi-jedi.org/上边下载,但是我英语太烂,确实没有找到,知道的大神请告知一下, 谢谢!下载下来的JNI.pas是很老的版本,所以我对JNI中包PChar和PAnsiChar转换错误的地方做了修改。


2、写java类:

我们需要写一个java的类,通过申明调用由delphi实现的native方法来达到目的,很明显,native的方法需要有delphi来实现,而我们java代码不需要实现该方法:

package test.nativeTest;

/**
 * java与delphi的数据交换
 * 
 * @author dendy
 * 
 */
public class NativeTestByDelphi {
	static {
		// 加载动态链接库
		System.loadLibrary("nativetest");
	}

	/**
	 * 直接打印一个字符串
	 * 
	 * @param s
	 */
	public static native void say(String s);

	/**
	 * 显示一个窗体界面
	 */
	public static native void showWindow();

	/**
	 * 获取一个整型数据
	 * 
	 * @return
	 */
	public static native int getVisitedCount();

	public static void main(String[] args) {
		say("你还好吗?");
		showWindow();
		System.out.println("visited count : " + getVisitedCount());
	}
}

3、创建delphi的工程:

直接新建一个dll工程,在工程中加入JNI.pas,这样可以自动引入到dll项目文件中。

在delphi这边编写java能够访问的方法时,JNI.pas帮我们写好了java和delphi数据交互的各个类和数据类型,需要用到时可以参看JNI.pas的源码。

java与jni.pas对应的类型对照
java的数据类型 JNI.pas中定义的数据类型 delphi的数据类型
byte JByte ShortInt
char JChar WideChar
short JShort SmallInt
int JInt Integer
long JLong Int64
float JFloat Single
double JDouble Double
boolean JBoolean Boolean

JNI.pas中数据类型的定义如下:

// JNI Types
  JBoolean = Boolean;
  JChar = WideChar;
  JShort = Smallint;
  JFloat = Single;
  JDouble = Double;
  JSize = JInt;

  _JObject = record
  end;

  JObject = ^_JObject;
  JClass = JObject;
  JThrowable = JObject;
  JString = JObject;
  JArray = JObject;
  JBooleanArray = JArray;
  JByteArray = JArray;
  JCharArray = JArray;
  JShortArray = JArray;
  JIntArray = JArray;
  JLongArray = JArray;
  JFloatArray = JArray;
  JDoubleArray = JArray;
  JObjectArray = JArray;

  JWeak = JObject;
  JRef = JObject;

  JValue = packed record
    case Integer of
      0:
        (z: JBoolean);
      1:
        (b: JByte);
      2:
        (c: JChar);
      3:
        (s: JShort);
      4:
        (i: JInt);
      5:
        (j: JLong);
      6:
        (f: JFloat);
      7:
        (d: JDouble);
      8:
        (l: JObject);
  end;

  JFieldID = ^_JFieldID;

  _JFieldID = record
  end;

  JMethodID = ^_JMethodID;

  _JMethodID = record
  end;

  PPointer = ^Pointer;
  PJByte = ^JByte;
  PJBoolean = ^JBoolean;
  PJChar = ^JChar;
  PJShort = ^JShort;
  PJInt = ^JInt;
  PJLong = ^JLong;
  PJFloat = ^JFloat;
  PJDouble = ^JDouble;
  PJString = ^JString;
  PJSize = ^JSize;
  PJClass = ^JClass;
  PJObject = ^JObject;
  PJThrowable = ^JThrowable;
  PJArray = ^JArray;
  PJByteArray = ^JByteArray;
  PJBooleanArray = ^JBooleanArray;
  PJCharArray = ^JCharArray;
  PJShortArray = ^JShortArray;
  PJIntArray = ^JIntArray;
  PJLongArray = ^JLongArray;
  PJFloatArray = ^JFloatArray;
  PJDoubleArray = ^JDoubleArray;
  PJObjectArray = ^JObjectArray;
  PJFieldID = ^JFieldID;
  PJMethodID = ^JMethodID;
  PJValue = ^JValue;
  PJWeak = ^JWeak;
  PJRef = ^JRef;

delphi dll代码:

library nativetest;

{ 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
  SysUtils,
  Classes,
  JNI in '..\jni_pas\JNI.pas',
  form in 'form.pas' {Form1};
var
  cnt : Integer;
{$R *.res}

{******************************************************************************
    注意命名规则:Java和方法的完整名称(带全类名),其中的点号修改为下划线
    参数:
        PEnv:JNI.pas中定义的类型,delphi与Java数据交互的通道。
        Obj:暂时不知道是干什么的?
        s :java传递过来的参数,java的String类型对应JNI.pas中定义的JString类型.
******************************************************************************}
procedure Java_test_nativeTest_NativeTestByDelphi_say(PEnv: PJNIenv;
  Obj: JObject; s: JString); stdcall;
var
  JVM: TJNIEnv;
begin
  JVM := TJNIEnv.Create(PEnv);
  writeln(JVM.UnicodeJStringToString(s));
  JVM.Free;
end;

function Java_test_nativeTest_NativeTestByDelphi_getVisitedCount(PEnv: PJNIenv;
  Obj: JObject) : JInt; stdcall;
var
  JVM: TJNIEnv;
begin
  cnt := cnt + 1;
  JVM := TJNIEnv.Create(PEnv);
  JVM.Free;
  Result := cnt;
end;

procedure Java_test_nativeTest_NativeTestByDelphi_showWindow(PEnv: PJNIenv;
  Obj: JObject); stdcall;
var
  form: TForm1;
begin
  form := TForm1.Create(nil);
  form.ShowModal;
end;

{导出方法,这样java那边才可以调用}
exports
  Java_test_nativeTest_NativeTestByDelphi_say,
  Java_test_nativeTest_NativeTestByDelphi_showWindow,
  Java_test_nativeTest_NativeTestByDelphi_getVisitedCount;

begin

end.

form的代码很简单,就一个label打印一句话而已,这里就不贴出来了.

4、注意:

运行的时候,需要将dll放到class文件的根目录,我这里放到跟test文件夹同一级中的,然后调用java命令执行类:java test/nativeTest/NativeTestByDelphi,在eclipse执行不成功,应该是要修改执行参数,还没研究,搞定了再来写上……


分享到:
评论

相关推荐

    java调用delphi动态库的实例

    - 编译C/C++源文件为动态链接库,如`libDelphiDLLJNI.so`(在Windows上可能是`.dll`文件),并确保与Java程序在同一路径下。 4. **在Java程序中调用** - 最后,在Java应用程序中,我们可以直接调用`addNumbers`...

    java与Delphi写的dll交互

    本文将深入探讨这个主题,介绍如何在Java应用程序中调用由Delphi编译的动态链接库(DLL),以及DLL开发的基本概念。 首先,让我们了解DLL的基本原理。DLL是一种可执行文件,它包含可由多个程序共享的代码和数据。...

    Delphi10.3 中通过JNI调用 Java 函数

    在Delphi中,我们需要编写C或C++的动态链接库(DLL),这个DLL将作为Delphi和Java之间的桥梁。 在Delphi 10.3中,我们可以使用Embarcadero的C++Builder工具链来创建这个DLL,因为C++Builder支持JNI接口的直接调用。...

    delphi调用Java函数

    2. **JNI接口**:在Delphi中,你需要使用C/C++的头文件来创建一个动态链接库(DLL),实现JNI接口。在DLL中,你可以直接调用Java的函数。Delphi提供了`JvJavaDLL`等组件,简化了与JNI的交互。 3. **注册Java虚拟机...

    Delphi调用Java类和包源代码

    2. **JNI接口定义**:在Delphi中,我们需要创建一个动态链接库(DLL),该库将作为Delphi与Java的接口。首先,我们需要定义Java端的JNI函数,这通常是在Java的`.java`文件中,使用`native`关键字声明。然后,通过`...

    delphi调用java类,包.rar

    3. **动态链接库(DLL)**:在Delphi中,我们可以创建动态链接库,然后通过JNI在Java中加载这个DLL,这样就可以调用Delphi编写的函数。Java会通过System.loadLibrary方法加载DLL,并通过JNI函数指针来调用Delphi中的...

    java 调用delphi写的dll的全套资料,可运行

    Java调用Delphi编写的DLL(动态链接库)是一种跨平台和语言的集成技术,它允许Java应用程序利用Delphi DLL中的功能。以下是一份详细的知识点解析,涵盖了这个主题的各个方面: 1. **Java Native Interface (JNI)**:...

    Java调用Delphi开发的Dll小结[归类].pdf

    本文主要讨论了两种方法,使得Java应用程序能够调用由Delphi开发的DLL动态链接库。这两种方法分别是:通过JNI(Java Native Interface)和使用JNA(Java Native Access)第三方组件。 1. **JNI调用Delphi开发的DLL*...

    delphi执行java的sdk

    在IT行业中,跨平台开发是常见的需求,而Delphi作为一款强大的Windows应用程序开发工具,有时候我们需要让它与Java环境进行交互。本篇文章将详细介绍如何在Delphi中利用SDK来执行Java代码,实现两者之间的无缝对接。...

    Java 調用Delphi 的DLL文件的实例

    本实例主要关注如何在Java环境中调用由Delphi编译的DLL动态链接库文件。这通常涉及到Java的本地接口(JNI,Java Native Interface)技术,它是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。下面...

    jni java delphi调用

    - 在Java端,首先定义一个本地方法,使用`native`关键字标记,然后通过`System.loadLibrary`加载动态链接库(DLL)。 - Delphi端编写本地代码,实现Java中声明的本地方法。这些方法需要按照JNI规范来编写,使用`...

    Java调用Delphi开发的Dll小结.pdf

    在Java开发中,有时需要调用由其他编程语言如Delphi编写的DLL动态链接库。本文将详细讲解两种方法,使得Java能够与Delphi开发的DLL进行交互。 1. 通过JNI(Java Native Interface)调用Delphi DLL: JNI是一种让...

    delphi调用java类的jni完整版

    1. **设置环境**:首先,需要在Delphi项目中配置JNI库,确保它能够找到Java虚拟机(JVM)的动态链接库(DLL)。 2. **加载类**:使用JNI函数`FindClass`查找Java类。例如,如果Java类名为`com.example.MyClass`,则...

    RFID读卡程序-桌面应用程序-Java-JNI调用Delphi版DLL

    在本项目中,我们关注的是一个基于桌面的应用程序,它利用Java语言来实现RFID读卡功能,并通过JNI(Java Native Interface)调用了Delphi编写的DLL(动态链接库)。 Java JNI是Java平台提供的一种原生接口,允许...

    Java调用Delphi的Dll发送短信演示.rar

    本示例着重讲解如何使用Java调用由Delphi编译的动态链接库(Dll)来实现发送短信的功能。这涉及到Java的JNI(Java Native Interface)技术以及Delphi的DLL开发。 1. **Java Native Interface (JNI)** JNI是Java...

Global site tag (gtag.js) - Google Analytics