环境: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需要放到System32或java工程根目录下;否则会报找不到库文件的错:
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一下)