0

我有一个 java 类,它通过 JNI C++ 类调用 C++ 类来访问 libmagic.so 提供的“文件”命令功能。

  • C++ 类作为 C++ main() 编译并运行良好

- 它在运行 java 1.5 和 1.6 的 RHEL 5 上运行良好;

- 它在运行 java 1.5 的 RHEL 4 上运行良好

- 它在使用 java 1.6 的 RHEL 4 上引发 seg fault 26234

段错误:

  1. 发生在调用 char* retptr = magic_buffer(cookie, bigbuf, 1000); char* retptr = “一个不错的安全字符串”时没有错误;被替换。这就是为什么我断定在这次调用中发生了段错误。

  2. 我使用另一个调用,char* retptr = magic_file(cookie,"/usr/include/magic.h"); 调试缓冲区问题,因为此调用返回相同的文件类型消息,只需要文件的完全限定路径名,而不是充满文件内容的缓冲区。它还会在 RHEL4/java 1.6 测试 VM 上引发 seg 错误。因此,我得出结论,问题似乎不是我的代码中的错误指针或溢出缓冲区。

  3. magic_buffer 是对 libmagic.so 的调用。在前面的代码中,对这个库进行了其他成功的调用。但是,此调用涉及 lib 魔术数据库 /usr/share/file/magic。

  4. 将 C++ 编译为可执行文件并在问题机器上运行它就可以了。

以下是一些结论:

A. 有 JNI 参与,因为 #4

B. 因为#1/#2,我不认为这是一个 JNI 实现问题。

C. 因为#1、#2 和#4,我不认为这是 C++ 实现问题。

有什么建议或意见吗?(最初在 VMWare 上运行,现在在没有 VM 参与的情况下进行了测试)

4

1 回答 1

0

我的第一个建议是尝试找到一个纯 Java 替代方案。 此页面列出了许多替代方案。Apache Tika 和 JMimeMagic 看起来很有希望。

我的第二个建议是使用在单独的进程中Process运行命令,并从命令的标准输出中抓取您需要的信息。file如果您需要每秒执行数百次,这可能会出现(咳咳)性能问题,但偶尔使用它应该没问题。

于 2010-01-20T22:18:31.330 回答