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

时间:2016-12-22 06:22:25

标签: 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 | grep java | wc -l <​​/ em>

773

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

ps -e -T | grep java | wc -l <​​/ em>

153

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

导致JNA调用失败的java线程数是多少?

1 个答案:

答案 0 :(得分:0)

您没有在Java中获得任何异常,因为Java没有遇到任何问题。它将代码传递给C,并在C代码运行后获得控制权,无论是否成功。

请注意,system()调用会返回intThis value has meaning

  

错误时返回的值为-1,否则返回命令的返回状态。

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

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

然后你可以测试ret的值。如果值为-1,则表示运行shell命令时出现问题(system()调用/bin/sh -c,因此您可以查看。)否则,返回值将是您的命令的结果,在此case convert命令。这是a list of possible results

ret成功时应该等于0,否则,您可以在上面的链接中查找ret的值,并获得无法正常工作的具体原因。