java - JNA 调用失败,没有任何异常

标签 java exception java-native-interface jna

我们使用 JNA 调用来运行 ImageMagick 命令。

最初每个调用都是成功的,我们没有发现任何问题,几天后我们发现一些 ImageMagick 命令失败。现在,每个命令都失败了。

我们在服务器日志中没有发现任何异常。

我可以知道成功运行这些命令需要进行哪些更改。

public class runMagick {

    private interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        int system(String cmd);
    }

    public void runCmd() {
        String strCommand = "convert test.jpg test.gif";
        CLibrary.INSTANCE.system(strCommand);
    }
}

操作系统:Linux JAVA版本:1.6.0_34

我们最近观察到的两件事:

服务器重新启动后,每个 JNA 调用都工作正常 发现创建和运行的 java 线程数量较多。我们使用以下命令来获取正在运行的线程数

ps -e -T | java | grep | wc -l

773

服务器重新启动后,上述命令的计数返回较少的数字。

ps -e -T | java | grep | wc -l

153

JNA 调用是否会创建单独的 java 线程?

是否是java线程数导致JNA调用失败?

最佳答案

您在 Java 中没有遇到任何异常,因为 Java 没有发现任何问题。它将代码传递给 C,并在 C 代码运行后(无论成功与否)收回控制权。

请注意,system() 调用返回一个 intThis value has meaning :

The value returned is -1 on error, and the return status of the command otherwise.

所以你应该捕获这个返回值,例如,

int ret = CLibrary.INSTANCE.system(strCommand);

然后就可以测试ret的值了。如果该值为 -1,则表示运行 shell 命令时出现问题(system() 调用 /bin/sh -c,以便您查看那里。)否则,返回值将是您的命令(在本例中为 convert)命令的结果。这是a list of possible results .

ret 成功时应等于 0,否则,您可以在上面的链接中查找 ret 的值并获取其失败的具体原因。

关于java - JNA 调用失败,没有任何异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41276915/

相关文章:

java - 如何获取未知json对象结构的Json键值

exception - 哪种契约(Contract)(按契约(Contract)设计)更好?

java - 在 JNI 中获取并打印字符串数组

java - 非空列表上的 NoSuchElementException

java - Java 中的 OverLimit 异常处理

java - 在 ARM 上使用 BlueCove-DBus。 Linux 上 C 库和 Java 代码 (JNI) 之间的链接器错误

java - JNI Java 来自 C 多个 Java 依赖项

java - 在 Java 中读取文件并拆分行。

java - 我应该将哪个文件夹导入 android studio 以便我可以打开现有项目?

java - 在批处理文件运行时显示不确定的 JProgressBar