JNI:Java调用Delphi编写的dll

JNI:Java调用Delphi编写的dll

分享
标签: JNI  delphi  java  UnsatisfiedLinkError  loadLibrary  分类: 编程(JAVA) 2011-08-31 11:36

环境:Windows xp/Eclipse3.6/Delphi2007


一、Java代码:

package com.antsleg.metasys.engine.test;

public class TestJNI {

static { System.loadLibrary("Project1");}

public native int Msg(String msg);//必须为native

public static void main(String[] args) {

TestJNI testJNI = new TestJNI();

testJNI.Msg("hello~, JNI!");

}

}


二、Delphi代码:

library Project1;


uses

  SysUtils,

  Classes,

  Dialogs,

  Forms,

  JNI in 'D:\Projects\Ctrls\JNI\JNI.pas';

{$R *.res}

   

  //Summary:

  //  方法名格式:Java_包名_类名_方法名

  //Parameters:

  //  PJNIEnv      -   DELPHI支持JNI的一些环境,直接加上就行

  //  JObject      -

  procedure Java_com_antsleg_metasys_engine_test_TestJNI_Msg(PEnv: PJNIEnv; Obj: JObject; msg:JString); stdcall;

  var

    JVM: TJNIEnv;

    Str: string;

  begin

    JVM := TJNIEnv.Create(PEnv);

    Str := JVM.UnicodeJStringToString(msg);//需要将Java的字符串转变为Delphi的字符串

    ShowMessage(Str);

  end;


  exports

     Java_com_antsleg_metasys_engine_test_TestJNI_Msg;//公开JNI方法


begin

end.


三、总结:

1.Project1.dll需要放到System32java工程根目录下;否则会报找不到库文件的错:

java.lang.UnsatisfiedLinkError: no Project1 in java.library.path

2.切记Delphi中方法名必须按照“Java_包名_类名_方法名”的格式书写,否则会提示找不到方法名:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Msg

3.Delphi中的数据格式和Java中的数据格式不一样,在Delphi的方法内,处理Java传入的数据时,需要先转换为Delphi的数据(否则你会发现数据不对);

如果还要返回数据,则还需转换为Java的数据再返回。这些转化操作在JNI.pas中(木有的话,就自己Google一下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值