[英]Java Program terminates after JNI method call
我正在使用JNI调用本机C方法,但是我的java程序在第一个方法调用后终止(退出代码0),并且未到达其余代码。
这是我的资料来源:
Exec.java:
package libs;
public class Exec {
static {
System.load(System.getProperty("user.dir")+"/bin/"+"libexec.so");
}
public static native int execv(String pExecPath, String[] pArgs);
}
Exec.c:
#include <jni.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
JNIEXPORT jint JNICALL
Java_libs_Exec_execv(JNIEnv * env, jclass clazz, jstring pExecPath, jobjectArray array) {
const char* execPath = (*env)->GetStringUTFChars(env, pExecPath, NULL);
(*env)->ReleaseStringUTFChars(env, pExecPath, NULL);
printf("Execution path: %s\n", execPath);
int stringCount = (int) (*env)->GetArrayLength(env, array);
char * args[stringCount+1];
args[stringCount] = NULL;
for (int i=0; i<stringCount; i++) {
jstring string = (jstring) (*env)->GetObjectArrayElement(env, array, i);
char * arg = (*env)->GetStringUTFChars(env, string, 0);
printf("Argument %i:\t%s\n", (i+1), arg);
args[i] = arg;
(*env)->ReleaseStringUTFChars(env, string, 0);
}
int result = execv(execPath, args);
printf("Exit code: %i\n", result);
perror(NULL);
return result;
}
TestExec.java:
package test;
import libs.Exec;
public class TestExec extends Exec {
public static void main(String[] args) {
execv("/bin/ps", new String[]{"ps", "ax"});
execv("/bin/ls", new String[]{"ls", "-la", "/home"});
}
}
控制台输出:
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /sbin/init
[...]
5532 ? R 0:00 ps ax
我还缺少我的c方法的控制台输出,该输出应如下所示:
Execution path: /bin/ps
Argument 1: ax
Exit code: 0
我希望我能提供足够的信息以获得合格的帮助。
当然会终止。 您正在调用execv()。 您要用“ ps”程序替换JVM,然后退出,这样就完成了。
当您仍然持有指向chars的指针时,无法调用ReleaseStringUTFChars()。
除非出现错误,否则在调用“ execv()”之后您将看不到进程的任何输出。
你确定你要这么做吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.