2015-11-11 87 views
0

我知道,https://stackoverflow.com/上有很多類似的問題,但是他們沒有解決我的問題。JNI FindClass返回NULL - 非常奇怪

我有一個簡單的Java類,而不包:

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class TestConsoleHandler { 

    private static Thread hook; 

    static File f = new File("c:\\Users\\ArtUrlWWW\\Documents\\NetBeansProjects\\mavenproject1\\shutdown.txt"); 

    public static void main(String[] args) { 

     FileWriter fw = null; 
     try { 
      try { 
       f.createNewFile(); 
      } catch (Exception ex) { 
       Logger.getLogger(TestConsoleHandler.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      fw = new FileWriter(f); 
      fw.write("Start \r\n"); 
      fw.close(); 
      System.out.println(); 
      hook = new ShutdownHook(); 
      Runtime.getRuntime().addShutdownHook(hook); 
      replaceConsoleHandler(); // actually not "replace" but "add" 
      try { 
       Thread.sleep(10000); // You have 10 seconds to close console 
      } catch (InterruptedException e) { 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(TestConsoleHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       fw.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(TestConsoleHandler.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

    public static void shutdown() { 
     try { 
      FileWriter fw = new FileWriter(f); 
      fw.write("Running shutdown \r\n"); 
      fw.close(); 

      hook.run(); 
     } catch (IOException ex) { 
      Logger.getLogger(TestConsoleHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private static native void replaceConsoleHandler(); 

    static { 
     System.loadLibrary("sdh"); 
    } 
} 

,我想打電話從JNI該類:

// JavaService.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <Windows.h> 
#include "jni.h" 

typedef struct JavaVMCreationResult { 
    JavaVM* jvm; 
    JNIEnv* env; 
} JVMCreationResult; 

JVMCreationResult* CreateJavaVM() { 
    JavaVM* jvm; 
    JNIEnv* env; 

    JavaVMInitArgs vm_args; 
    JavaVMOption* options = new JavaVMOption[1]; 
    options[0].optionString = "-Djava.class.path=c:/Users/ArtUrlWWW/Documents/NetBeansProjects/mavenproject1/target/"; 
    vm_args.version = JNI_VERSION_1_6; 
    vm_args.nOptions = 1; 
    vm_args.options = options; 
    vm_args.ignoreUnrecognized = JNI_TRUE; 
    JNI_GetDefaultJavaVMInitArgs(&vm_args); 

    JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); 

    JVMCreationResult* cres = new JVMCreationResult(); 
    cres->jvm = jvm; 
    cres->env = env; 

    env->GetJavaVM(&jvm); 

    jint res = jvm->AttachCurrentThread((void **)(&env), &env); 

    return cres; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    JVMCreationResult* cres = CreateJavaVM(); 
    if (!cres) return -1; 
    JavaVM* jvm = cres->jvm; 
    JNIEnv* env = cres->env; 

    if (&env == NULL) { 
     printf("env IS NULL!!! \n\n"); 
    } 

    jint res = jvm->AttachCurrentThread((void **)(&env), &env); 
    printf("STEP 1 \n\n"); 
    jclass cls = env->FindClass("TestConsoleHandler"); 
    printf("STEP 2 \n\n"); 
    if (cls == NULL) { 
     printf("Class IS NULL!!! \n\n"); 
    } 
    printf("STEP 3 \n\n"); 
    /*jmethodID mid = env->GetStaticMethodID(cls, "shutdown", "()V"); 
    printf("STEP 4 \n\n"); 
    env->CallStaticVoidMethod(cls, mid); 
    jvm->DetachCurrentThread();*/ 

    return 0; 
} 

在C:/用戶/ ArtUrlWWW /文件/的NetBeansProjects/mavenproject1 /目標/我有1.jar,包含所需的類: enter image description here

但我PROGRAMM找不到類: enter image description here

請指教,如何解決這個問題?

非常感謝!

+0

您應該使用'-classpath'選項而不是直接指定系統主體。 – EJP

回答

0

問題出在代碼System.loadLibrary("sdh");。替換後用

System.load("c:/Users/ArtUrlWWW/Documents/NetBeansProjects/mavenproject1/sdh.dll"); 

一切正常。

0

正如你已經指出了答案我只補充一點,功能

System.loadLibrary("sdh"); 

尋找這就是爲什麼它沒有工作的文件「libsdh.so」。