0

私のマシンのTomcatサーバーで実行される単純なJavaサーブレットを構築しようとしています。

私のサーブレットコードは次のとおりです。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class javaservlet
 */
@WebServlet(description = "java servlet", urlPatterns = { "/javaservlet" })
public class javaservlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    /**
     * @see HttpServlet#HttpServlet()
     */
    public javaservlet() {
        super();

        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter writer = response.getWriter();
        calldll callingdll = new calldll();
        ServletContext context = getServletConfig().getServletContext();  
        String path = context.getContextPath(); 
        writer.println(path);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

そしてそれは正常に動作します(calldll callingdll = new calldll();私がそこで得たエラーを以下で説明する部分ではありません)

「calldll.dll」と呼ばれるdllファイルをロードする2番目のクラスもあります( javac 、 javah などですべての作業を行い、動作します)私のdllが配置されC:\apache-tomcat-7.0.37\wtpwebapps\myServlet\WEB-INF\lib、そこにネイティブのビルドパスとクラスコードを指定しましたは

public class calldll {

    private native void print();

public static void main (String[] args){
    new calldll().print();
}

static {
System.loadLibrary("calldll");  
}

}

私がdllを作成した私のcファイルは本当に単純です

#include<jni.h>
#include<stdio.h>
#include<windows.h>
#include "calldll.h"

JNIEXPORT void JNICALL
Java_calldll_print(JNIEnv*env,jobject obj)
{
printf("It Works!");
return;
}

dllをロードするcall dllクラスを呼び出すjavaservletを実行すると、次のようになります。

java.lang.NoClassDefFoundError: Could not initialize class calldll
    javaservlet.doGet(javaservlet.java:33)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

奇妙なことは、Javaクラスを単独で実行すると、「動作します」というメッセージが表示されるため、クラスがdllを正常にロードすることです。しかし、サーブレットでクラスのインスタンスを作成すると、それはサーブレットからではありません。それは私の問題ではありません....

私はcalldllクラスに追加しました

catch(UnsatisfiedLinkError e) { System.err.println("ネイティブ コード ライブラリの読み込みに失敗しました。\n" + e); }

静的に問題があるかどうかを確認するには、サーブレットを実行すると次のエラーが発生します

Native code library failed to load.
java.lang.UnsatisfiedLinkError: no calldll in java.library.path

しかし、私のcalldllクラスは、単独で実行しても機能します...だから、私が間違っているサーブレットで何が起こっているのですか:s

4

1 に答える 1

0

webapp が tomcat アプリ サーバーでホストされている場合は、dll を bin フォルダーにコピーしてから、サーブレットで次を使用します。

System.load(System.getProperty("catalina.base")+"/bin/yourdll.dll");
于 2015-06-01T09:05:49.727 に答える