注意:
linuxua下JNA/JNI调用lazarus0.9.x编译的共享库,会造成JVM的崩溃,慎用!也许更高版本的lazarus会更正这个问题,不管怎样,使用之前要做充分的测试。
lazarus代码
procedure hello2(const name : PChar; var bytAry : TByteArray; var len : Integer); stdcall;
var
s : AnsiString;
begin
s := format('hello %s', [strpas(name)]);
len := length(s);
s := s + ' ';
TByteArrayUtils.copy(@bytAry, @s[1], length(s));
end;
linux下编译后的文件名是libdemo.so
windows下编译后的文件名是libdemo.dll
对应java类声明
public interface DllLib extends Library{
DllLib instance = (DllLib)Native.loadLibrary("asmtux",DllLib.class);
void hello(String name, int age);
void hello1(String name, String[] strs);
void hello2(String name, ByteBuffer bytArray, IntByReference len);
}
调用代码
ByteBuffer buffer = ByteBuffer.allocate(255);
IntByReference lenRef = new IntByReference();
DllLib.instance.hello2("jim", buffer, lenRef);
int len = lenRef.getValue();
byte[] byTemp = new byte[255];
buffer.get(byTemp, 0, len);
System.out.println(new String(byTemp, 0, len))
最后界面上输出 hello jim,
此代码在tomcat上运行成功
附上servlet代码
package com.asm.app;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
@WebServlet(urlPatterns="/jna")
public class JNADemo extends HttpServlet {
public interface DllLib extends Library{
DllLib instance = (DllLib)Native.loadLibrary("demo",DllLib.class);
void hello2(String name, ByteBuffer bytArray, IntByReference len);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(255);
IntByReference lenRef = new IntByReference();
DllLib.instance.hello2("jim", buffer, lenRef);
int len = lenRef.getValue();
byte[] byTemp = new byte[255];
buffer.get(byTemp, 0, len);
out.println(new String(byTemp, 0, len));
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
