我有java web应用程序,它调用编译成C
的{{1}}个类。当前.DLL
需要INPUT文件并将其用作字典。我的Web应用程序部署在Tomcat上 - 所以为了使一切正常工作,我必须将我的字典输入文件放在DLL
目录下,否则C:\apache-tomcat-7.0.14\bin
无法找到它。
我认为这不是我的输入文件的好位置。您能否建议我如何为输入文件配置不同的位置?
感谢您的帮助!
答案 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. */