Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序在JNI方法调用后终止_Java_C_Linux_Java Native Interface_Execv - Fatal编程技术网

Java程序在JNI方法调用后终止

Java程序在JNI方法调用后终止,java,c,linux,java-native-interface,execv,Java,C,Linux,Java Native Interface,Execv,我使用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(Stri

我使用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);
}
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"});
}
}
执行委员会:

#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;
}
控制台输出:

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,该程序将退出,所以您就完成了

当您仍然持有指向字符的指针时,不能调用ReleaseStringUTFChars()

在调用“execv()”之后,您将看不到进程的任何输出,除非出现错误


确实要这样做吗?

事实上,我想用execv()启动一个新的子进程,但仍然可以看到它的输出。我不知道execv()会替换当前进程。我将使用fork(),我想我的库需要一个main方法?我只能建议您在使用系统调用之前阅读它们的文档。我认为没有必要这样做。Runtime.exec()已存在。