我们使用 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()
调用返回一个 int
。 This 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/