java - Java中的本机方法实现
问题描述
如何获得private static native void terminateProcess(long handle)
ie被destroyForcibly()
方法调用的内部实现?
根据以下参考
destroyForcibly()
方法在此来源中不可用。请帮忙。
解决方案
您可以使用可以创建本机 (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;
}
}
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找到它
如您所见,这两种实现都是在kill和TerminateProcess系统调用之上的简单包装器。
推荐阅读
- mongodb - Aggregate array with order in mongodb
- c# - 使用通用主机时,在 NetCore 中使用 Serilog 配置日志记录的首选方法是什么?
- ios - SDK:iOS静态库实现
- javascript - 在 React js 中渲染嵌套的 json 数据
- spring-boot - 在 AWS Fargate 上使用 HTTPS 的 Spring Boot 应用程序
- css - CSS calc() 函数不分配负数
- x86 - puts@@GLIBC_2.2.5 在什么库中
- python - python 3.8中的singledispatchmethod和类方法装饰器
- ubuntu - Nginx 不显示 ServerBlocks
- spring-boot - 在 Spring Boot 中禁用 CSRF 的原因