首页 > 解决方案 > Java中的本机方法实现

问题描述

如何获得private static native void terminateProcess(long handle)ie被destroyForcibly()方法调用的内部实现?

根据以下参考

在哪里可以找到 java.lang 本机方法的源代码?

destroyForcibly()方法在此来源中不可用。请帮忙。

标签: javanative

解决方案


您可以使用可以创建本机 (CPU) 代码的某种编程语言来实现它。例如 C、C++、Fortran、Pascal、D、Go 或汇编。Java 编译器 - javac 生成通用字节码,即中间表示。当 java - 虚拟机,即解释器 - 首先将其转换为本机 CPU 代码。这样一来,您就可以在不同的 CPU 架构或操作系统上运行一些通用程序,而无需进行任何修改。这种范式称为——一次编写,到处运行。但是,有时您的程序需要一些用另一种编程语言实现的功能,或者有一些性能关键的功能应该被提升。在这种情况下,java 虚拟机有能力运行一些外部本地函数。该函数必须满足特定的二进制接口。IE 调用约定和命名约定。这个函数应该放在平台特定的共享库中,即 Windows 上的 DLL,所以在 Linux 和大多数其他类 unix 系统上,除了 Mac OS X - 它是 dynalib。如果你真的需要使用 JNI 请按照手册JNI

无论如何-据我了解,您正在寻找Process.destroyForcibly的实现 它取决于平台,您可以在 OpenJDK 公共存储库libjava中找到它 例如 Unix 版本如下所示:

/*
 * Class:     java_lang_ProcessHandleImpl
 * Method:    destroy0
 * Signature: (JJZ)Z
 */
JNIEXPORT jboolean JNICALL
Java_java_lang_ProcessHandleImpl_destroy0(JNIEnv *env,
                                          jobject obj,
                                          jlong jpid,
                                          jlong startTime,
                                          jboolean force) {
    pid_t pid = (pid_t) jpid;
    int sig = (force == JNI_TRUE) ? SIGKILL : SIGTERM;
    jlong start = Java_java_lang_ProcessHandleImpl_isAlive0(env, obj, jpid);

    if (start == startTime || start == 0 || startTime == 0) {
        return (kill(pid, sig) < 0) ? JNI_FALSE : JNI_TRUE;
    } else {
        return JNI_FALSE;
    }
}

你可以在ProcessHandleImpl_unix找到它

Windows 版本如下所示:

/*
 * Destroy the process.
 *
 * Class:     java_lang_ProcessHandleImpl
 * Method:    destroy0
 * Signature: (Z)V
 */
JNIEXPORT jboolean JNICALL
Java_java_lang_ProcessHandleImpl_destroy0(JNIEnv *env,
                                          jclass clazz,
                                          jlong jpid,
                                          jlong startTime,
                                          jboolean force) {
    DWORD pid = (DWORD)jpid;
    jboolean ret = JNI_FALSE;
    HANDLE handle = OpenProcess(PROCESS_TERMINATE | THREAD_QUERY_INFORMATION
                                | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
    if (handle != NULL) {
        jlong start = getStartTime(handle);
        if (start == startTime || startTime == 0) {
            ret = TerminateProcess(handle, 1) ? JNI_TRUE : JNI_FALSE;
        }
        CloseHandle(handle);         // Ignore return code
    }
    return ret;
}

你可以在ProcessHandleImpl_win.c找到它

如您所见,这两种实现都是在killTerminateProcess系统调用之上的简单包装器。


推荐阅读