首页 > 解决方案 > 尝试在 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 语言中进行过测试,并且可以正常工作。

标签: javajerseyjna

解决方案


推荐阅读