java - 尝试在 java 中调用 DLL 时出现错误:java.lang.Error: Invalid memory access
问题描述
我使用 Java + Jersey + JNA(https://mvnrepository.com/artifact/net.java.dev.jna/jna/4.5.2)来访问一个 DLL 文件,它是在 delphi 中制作的。
我的操作系统是 Windowns 10, 64bits。该 dll 以 64 位生成。
我只是想在java中访问DLL方法。
Java的代码是:
DllSimples.java
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface DllSimples extends Library{
String testar();
}
TesteService.java
public Response chamaDll() {
DllSimples calculadora = (DllSimples)
Native.loadLibrary("teste", DllSimples.class);
String parametro = calculadora.testar();
MensageiroDTO mensagem = new MensageiroDTO(parametro);
return Response.ok(mensagem).build();
}
pom.xml
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.2</version>
</dependency>
错误:
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.Error: Invalid memory access
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:432)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
org.glassfish.jersey.server.ContainerException: java.lang.Error: Invalid memory access
org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:278)
org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:260)
org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:460)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:285)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
注意:该 DLL 之前已在 DELPHI 语言中进行过测试,并且可以正常工作。
解决方案
推荐阅读
- android - 水平滚动视图下方的 WebView
- php - 从 XML 响应中提取某些值以创建自定义 JSON 数组
- javascript - VueJS 动态属性作为 HTML/VueMaterial 元素属性的值传递
- kubernetes - 在 yaml 中检索 kubernetes 集群中单个或一组资源的当前配置文件的最安全和最佳方式
- scala - 在 Scala 中使用 String.format 时出错 - java.util.MissingFormatArgumentException:格式说明符“%s”
- angular - 如何从nodejs以反应形式显示图像角度
- c# - 如何从 Oracle 数据库中的多个表中检索数据,创建 DataTable,然后将这些数据存储在 C# 中的类对象中?
- android - 如何解决领域和反应原生应用程序之间的同步问题?
- c++ - 创建一个排序算法,该算法将在一个while循环中以c ++中的特定顺序对多个字符串值进行排序
- javascript - 将展开数组映射到数字