I have a native method that I can merrily invoke from java code,as many time
as I like.

However, if I attempt to invoke this method a second time from a servlet,
then I get:

java.exe - Application Error
The instruction at "0x0020004d" referenced memory at "0x0020004d". The
memory could not be "read".

Click on OK to terminate the program
Click on CANCEL to debug the program


This error occurs after the servlet has actually completed all of its
processing, and the browser has displayed the results.

Oddly, If I call the method twice within the servlet, then it is OK. It is
only on the second invocation of the servlet that problem occurs.

I'm pretty sure it's something to do with the native method, because
everything is fine if I comment out that call.


Selecting CANCEL invokes the Visual C++ debugger, which usually shows the
machine code where the error occurs (unless you have debug info). But it
says:

Error attaching to process

Then:

Unhandleed error in java.exe: 0xC0000005: Access violation.

Any suggestions as to what may be happening (bearing in mind that I can call
the method from a standard app with no problems) would be massively
appreciated.

Here's the servlet code:



import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.lang.Long;
import java.lang.System;

public class SearchBean extends HttpServlet implements SingleThreadModel
{
  public native void connect(long DBID);
  public native synchronized void search(Object[][] results, long prodID,
long maxReturns, boolean filter, String queryString);

  private boolean doneit = false;

  public void init(ServletConfig config)
          throws ServletException
  {
    if(!doneit)
    {
      try
      {
        doneit = true;
        System.loadLibrary("NREJBSearchProcessor");     //I've tried doing this
in a static block, but there was no difference
      }
      catch(Exception e)
      {
      }
    }
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException
  {
    Long[][] results = new Long[2][];
    SearchBean sb = new SearchBean();


    try{
      sb.connect(1);
      sb.search(results, 1, 15, false, "product");
    }
    catch(Exception e)
    {
      System.out.println(e); //It doesn't seem to go into here
    }

    res.setContentType("text/html");

    PrintWriter out = res.getWriter();

    out.println("<HTML>");
    out.println("<HEAD><TITLE>Search Results</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<TABLE COLS=2 BORDER=1>");
    out.println("<TR><TD>ID</TD><TD>Score</TD></TR>");

    for(int i = 0; i < results[1].length; i++)
    {
      out.println("<TR><TD>" + results[0][i].intValue() + "</TD><TD>" +
results[1][i].intValue()/10 + "</TD></TR>");
    }
    out.println("</TABLE></BODY></HTML>");      //This line is delivered to the
browser

  }

  public String getServletInfo()
  {
    return "Search Servlet";
  }
}

I'm running on Windows 2000 Profession (NT5) Beta 3, using the http server
that comes with JSDK 2.1, and the standard Sun 1.2 JVM.

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

Reply via email to