сбой jvm, когда вызвать нативный код с jni? - PullRequest
0 голосов
/ 29 августа 2018

Я пишу программу на Java, которая использует jni для вызова нативного кода, когда я пытаюсь вызвать нативный код сбоя jvm? EXCEPTION_ACCESS_VIOLATION (0xc0000005) при pc = 0x0000000076f39958, pid = 4376, tid = 4388 siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), адрес чтения 0x0000000012004926

bwm_shutdownEvent.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class bwm_shutdownEvent */

#ifndef _Included_bwm_shutdownEvent
#define _Included_bwm_shutdownEvent
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     bwm_shutdownEvent
* Method:    registerEvent
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_bwm_shutdownEvent_registerEvent
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

shutdownEvent.cpp

#include <jni.h>
#include "bwm_shutdownEvent.h"
#include <windows.h>
#include <signal.h>
JavaVM *jvm=NULL;
const char g_szClassName[] = "bwm";
void callCallBack() {
JNIEnv *env;
jvm->AttachCurrentThread((void **)&env, NULL);
jclass cls=env->FindClass("bwm/shutdownEvent");
jmethodID mid=env->GetStaticMethodID(cls,"callback","()V");      
env->CallStaticVoidMethod(cls, mid);
jvm->DetachCurrentThread();
}
void callReload() {
JNIEnv *env;
jvm->AttachCurrentThread((void **)&env, NULL);
jclass cls=env->FindClass("bwm/shutdownEvent");
jmethodID mid=env->GetStaticMethodID(cls,"reload","()V");      
env->CallStaticVoidMethod(cls, mid);
jvm->DetachCurrentThread();
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam)
{

switch(msg) {
    case WM_CREATE:
        break;
    case WM_POWERBROADCAST:
        if (wParam==PBT_APMSUSPEND){/*go to sleep and hibernate*/
          callCallBack(); 
        }
        if(wParam==PBT_APMRESUMESUSPEND){/*wake up*/ 
           // callReload();
        }
        break;
    case WM_ENDSESSION:/*shut down and log off*/
        callCallBack();
         PostQuitMessage(0);
        break; 
    case WM_CLOSE:
        PostQuitMessage(0);
        break;    
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
    break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
void registerw() {
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
wc.cbSize        = sizeof(WNDCLASSEX);
wc.style         = 0;
wc.lpfnWndProc   = WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName  = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

if(!RegisterClassEx(&wc))
{
    MessageBox(NULL, "Window Registration Failed!", "Error!",
        MB_ICONEXCLAMATION | MB_OK);
    return;
}

// Step 2: Creating the Window
hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    g_szClassName,
    "The title of my window",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 24, 12,
    NULL, NULL, NULL, NULL);

if(hwnd == NULL)
{
    MessageBox(NULL, "Window Creation Failed!", "Error!",
        MB_ICONEXCLAMATION | MB_OK);
    return;
}

ShowWindow(hwnd, 1);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
}
JNIEXPORT void JNICALL Java_bwm_shutdownEvent_registerEvent
(JNIEnv *env, jobject){ 
jint rs = env->GetJavaVM(&jvm);
registerw();/* Creates window & enters message loop */
} 

shutdownEvent.java

 public class shutdownEvent {
  /**
 * @param args the command line arguments
 */
static{
    try{



  System.loadLibrary("shutdownEvent.dll");
    }
catch(Exception e){
     System.out.println("can not find dll");  
    }
}
public native void registerEvent();
private static void callback() throws IOException{
  System.out.println("ok that is ok"); 
  Alert alert=new Alert(Alert.AlertType.ERROR);
  alert.setContentText("hi");
 }
 private static void reload(){

 }
}
...