Java 一个函数多次调用:为什么?以及通过C的线程的不当使用?

Java 一个函数多次调用:为什么?以及通过C的线程的不当使用?,java,c,multithreading,winapi,java-native-interface,Java,C,Multithreading,Winapi,Java Native Interface,通过下面的代码,我试图实现一个简单的击键捕捉器。当用户点击一个键时,他会得到通知。Java代码加载dll,该dll运行DllMain方法,并从中启动新线程 Java代码在静态块中加载一个库。dll具有执行和打印一些语句的DllMain方法。它还从DllMain启动一个新线程。java程序中也启动了一个新线程,该线程休眠2毫秒。从输出来看,DllMain,installHook似乎被多次调用。为什么呢?有什么问题 虽然按键时会通知用户,但为什么会多次调用同一函数?我想我已经实现了函数install

通过下面的代码,我试图实现一个简单的击键捕捉器。当用户点击一个键时,他会得到通知。Java代码加载
dll
,该dll运行
DllMain
方法,并从中启动新线程

Java代码在静态块中加载一个库。
dll
具有执行和打印一些语句的
DllMain
方法。它还从
DllMain
启动一个新线程。java程序中也启动了一个新线程,该线程休眠2毫秒。从输出来看,
DllMain
installHook
似乎被多次调用。为什么呢?有什么问题

虽然按键时会通知用户,但为什么会多次调用同一函数?我想我已经实现了函数installHook,或者线程逻辑实现得很差

Java代码:

C代码:

从文件中:

动态链接库(DLL)的可选入口点。当系统启动或终止进程或线程时,它使用进程的第一个线程为每个加载的DLL调用入口点函数。当使用LoadLibrary和FreeLibrary函数加载或卸载DLL时,系统还会调用DLL的入口点函数

由于在该函数中创建线程,因此实际上有一个无限循环-
DllMain
(加载时)创建一个线程,因此调用
DllMain
,启动一个线程,因此调用
DllMain


仔细阅读该文档,如果原因不是
DLL\u PROCESS\u ATTACH
1
)。(实际上,我不确定从该过程启动线程是否合法。)

为什么要制作键盘记录器?@user1329572只是为了提高我的JNI技能。我最近学到了很多关于JNICreate函数的知识,并从Java调用了它。(注意:它可能是合法的,我不确定它是否非法-只是看起来有点可疑-您的主要问题是没有使用原因码。)问题是我必须将
DllMain
方法保留在code b'z中,因为没有它,我如何才能获得
fdreason
/
DLL\u PROCESS\u ATTACH
?我无法实现它:(要么保留DllMain并对其进行修改以正确处理原因,要么不保留DllMain并在JNI函数中执行所有需要执行的操作(包括初始化)。
package keylogger;

public class TestKeys {
private static int i = 0;
private native void setWinHook();
private native void unregisterWinHook();

public static void main(String args[]) {

    //TestKeys o = new TestKeys();


    System.out.println("After the call to load library !");

    Runnable r = new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println("Sleeping...");
                Thread.sleep(2);
            }catch(Exception exc) {
                exc.printStackTrace();
            }
        }
    };
    new Thread(r,"new thread").start();       
}

static {
    System.loadLibrary("MyHook");
}
}
#include <stdio.h>
#include <windows.h>
#include <w32api.h>
#include "keylogger_TestKeys.h"

static HHOOK handleKeyboardHook = NULL;
HINSTANCE hInst = NULL;
static DWORD hookThreadId = 0;
static HANDLE hookThreadHandle = NULL;
BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved);

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
 printf("You pressed the key !\n");
 return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
  LPTHREAD_START_ROUTINE lpStartAddress = &installHook;
  printf("From DllMain : %u\n",fwdReason);
  hookThreadHandle = CreateThread(NULL, 0, lpStartAddress, NULL, 0, &hookThreadId);
  if(hookThreadHandle == NULL) {
    printf("\nhookThreadHandle is NULL\n");
  }
  return TRUE;
}

JNIEXPORT void JNICALL Java_keylogger_TestKeys_unregisterWinHook
 (JNIEnv *env, jobject obj) {
   if(handleKeyboardHook != NULL) {
    UnhookWindowsHookEx(handleKeyboardHook);
    printf("Keyboard hook successfully unregistered !");
   } else {
      printf("Coudn't Unhook the keyboard hook !");
     }
} 

BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) {
printf("From installHook : %u",fwdReason);
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0);
MSG msg;

while(GetMessage(&msg, NULL, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
return msg.wParam;
From DllMain : 1
From DllMain : 2
From installHook : 66321916From DllMain : 2
After the call to load library !From installHook : 65797624
From DllMain : 2
From installHook : 67304108From DllMain : 2
From installHook : 60423404From DllMain : 2
From installHook : 67893304From DllMain : 2
From installHook : 68484828From DllMain : 2
From installHook : 69204012From DllMain : 2 
From installHook : 61799988From DllMain : 2
From installHook : 62847812From DllMain : 2
From DllMain : 2
Sleeping... 
From installHook : 71695184From DllMain : 2
From installHook : 70907884From DllMain : 2
From installHook : 70581032From DllMain : 2
From installHook : 72219984From DllMain : 2
From installHook : 73071020From DllMain : 2
From installHook : 66649544From DllMain : 2
From installHook : 73399648From DllMain : 3
From DllMain : 2
From DllMain : 3
From installHook : 73858604From DllMain : 2
From DllMain : 3
From installHook : 75955548From DllMain : 3
From DllMain : 2
From installHook : 72548100From DllMain : 2
From installHook : 74643796From DllMain : 2
From installHook : 75560952From DllMain : 3
From DllMain : 2
From installHook : 71236420From DllMain : 2
From installHook : 74316888From DllMain : 2
From installHook : 77265476From DllMain : 0

hookThreadHandle is NULL