项目要写个DLL调用硬件,因为人力资源的原因只能用Delphi7开发,结果发现传递中文有点问题,研究了一番后解决,其实很简单,关键是使用system.pas下的编码解码方法。以下在本机测试通过。


环境:

Win7 64位旗舰版

JDK1.6 x86(重要,不能使用x64版本)

MyEclipse8.6

Delphi7


Delphi代码:

library Project2;
uses
  SysUtils, Dialogs;
{$R *.res}
function testDLL(sInput: PChar):PChar; stdcall; export;
var
  sTemp : WideString;
begin
  sTemp := UTF8Decode(sInput);
  ShowMessage(sTemp);
  result := PChar(UTF8Encode('清純哲學TOP1賽高!'));
end;
exports
  testDLL index 1;
begin
end.



Java代码:

import com.sun.jna.win32.StdCallLibrary;//delphi7编译的dll一定要用这个,原因你懂的
import com.sun.jna.Native;
// 必须继承Library 这个是jna标准
// 必须定义一个接口,描述所调用的dll或者so文件的方法结构
public interface MyLibrary extends StdCallLibrary {
                                                                  
     MyLibrary instance = (MyLibrary)Native.loadLibrary("Project2",MyLibrary.class);
     //描述Project2.dll结构
     String testDLL(String sInput);
}
public static void main(String[] args) {
    try {
        String sInput = "峯岸Team4最高!";
        String tmp = MyLibrary.instance.testDLL(sInput);
        System.out.println(tmp);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


经测试DLL内ShowMessage及JAVA控制台输出中文均正常显示