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

标签 java c linux java-native-interface execv

我正在使用 JNI 调用 native C 方法,但我的 Java 程序在第一个方法调用后终止(退出代码 0)并且没有到达其余代码。

这是我的来源:

执行.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);
}

执行.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;
}

测试执行器.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,这样您就完成了。

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

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

您确定要这样做吗?

关于Java 程序在 JNI 方法调用后终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851048/

相关文章:

java - 如何设置自定义按钮的大小?

java - 单击按钮时更改位置?

c - 二维数组的名称是否给出了它在 C 中的基址?

linux - 直写 RAM 磁盘,还是文件系统的海量缓存?

linux - xfs - 写入文件时如何不修改 mtime?

java - 命令在终端中有效但在脚本中无效?

java - LOEclipse,如何在openoffice扩展中创建OptionsPage?

java - 如何从另一个类访问字符串值?

c - 使用字符串数组时出现总线错误 10 - C

c - 在c中显示数据包的内容