DLL的JAVA库路径INPUT / OUTPUT

时间:2015-01-21 17:22:52

标签: java tomcat dll java-native-interface

我有java web应用程序,它调用编译成C的{​​{1}}个类。当前.DLL需要INPUT文件并将其用作字典。我的Web应用程序部署在Tomcat上 - 所以为了使一切正常工作,我必须将我的字典输入文件放在DLL目录下,否则C:\apache-tomcat-7.0.14\bin无法找到它。

我认为这不是我的输入文件的好位置。您能否建议我如何为输入文件配置不同的位置?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您修改本机C代码以接受文件路径,那么这就不再是问题,因为您的Java代码可以指定文件的位置。

在您的Java类中:

public class Test {
  public native void toSomethingWithDictionary(String dictionaryFile);
}

在您的C代码中:

#include <sys/errno.h>
#include <string.h>
#include "test.h"

#define ERROR_MESSAGE_LENGTH 255

JNIEXPORT void JNICALL Java_Test_toSomethingWithDictionary
  (JNIEnv *env, jobject instance, jstring dictionaryFile)
{
    FILE *dict;
    const char *dict_path;

    dict_path = (*env)->GetStringUTFChars(env, dictionaryFile, 0);

    if(NULL == (dict = fopen(dict_path, "r"))) {
      /* Failed to open the file. Why? */
      char error_msg[ERROR_MESSAGE_LENGTH];

      strerror_r(errno, error_msg, ERROR_MESSAGE_LENGTH);

      strncat(error_msg, ": ", ERROR_MESSAGE_LENGTH - strlen(error_msg) - 1);

      strncat(error_msg, dict_path, ERROR_MESSAGE_LENGTH - strlen(error_msg) - 1);

      jclass ioe = (*env)->FindClass(env, "java/io/IOException");
      if(NULL == ioe) {
        goto cleanup;
      }
      (*env)->ThrowNew(env, ioe, error_msg);
      goto cleanup;
    }

    /* do whatever you want with your dictionary file */

    fclose(dict);

    cleanup:
    (*env)->ReleaseStringUTFChars(env, dictionaryFile, dict_path);
}

如果您希望为Test类提供更复杂的界面,则可以使用public void setDictionaryPath(String dictionaryPath)方法,然后让您的本机代码使用该方法来查找文件。

现在,当您准备好在Web应用程序中使用该类时,只需执行以下操作:

Test test = new Test();
test.doSomethingWithDictionary("/usr/share/dict/words");

或者,如果你想把文件放到磁盘上的某个地方:

ServletContext app = getServletContext();
Test test = new Test();
test.doSomethingWithDictionary(app.getRealPath("/META-INF/dict"));
/* NOTE: getRealPath is a bad API call to use. Find a better way. */