JNI UnsatisfiedLinkError

我想创建一个简单的JNI层。 我使用Visual Studio 2008创建了一个DLL(Win 32控制台应用程序项目类型,其中包含DLL)。 我在调用本机方法时遇到此exception:

Exception occurred during event dispatching: java.lang.UnsatisfiedLinkError: com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSch edulerNative.Hello()V at com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSchedulerNative.Hello(Na tive Method) at com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSchedulerUtil.isTaskExis ts(vcdbaTaskSchedulerUtil.java:118) at com.tpd.vcdba.console.Dialogs.schedulerWizardPage.scheduleTaskPage.wz Finish(scheduleTaskPage.java:969) at com.tpd.vcdba.console.wizard.vcdbaWizard.gotoFinish(vcdbaWizard.java: 434) at com.tpd.vcdba.console.wizard.wzActionPanel.actionPerformed(wzActionPa nel.java:163) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 

生成的头文件是:

 /* DO NOT EDIT THIS FILE - it is machine generated */ #include  /* Header for class com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative */ #ifndef _Included_com_tpd_vcdba_console_TaskScheduler_ vcdbaTaskSchedulerNative #define _Included_com_tpd_vcdba_console_TaskScheduler_ vcdbaTaskSchedulerNative #ifdef __cplusplus extern "C" { #endif /* * Class: com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative * Method: Hello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative_Hello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 

实现文件是:

 #pragma once #include "com_tpd_vcdba_console_TaskScheduler_ vcdbaTaskSchedulerNative.h" #include "stdafx.h" #include "jni.h" /* * Class: com_tpd_vcdba_console_TaskScheduler_vcdbaTaskScheduler_native * Method: Hello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative_Hello (JNIEnv *envs, jobject obj){ printf("hello world"); } 

java文件是:

 package com.tpd.vcdba.console.TaskScheduler; import com.tpd.vcdba.console.TaskScheduler.ScheduleTask; public class vcdbaTaskSchedulerNative { public native void Hello(); private static vcdbaTaskSchedulerNative instance = null; static{ try{ System.loadLibrary("JNITrial"); } catch(Exception ex){ } } public vcdbaTaskSchedulerNative(){ } public static vcdbaTaskSchedulerNative getInstance(){ if(instance == null){ instance = new vcdbaTaskSchedulerNative(); } return instance; } } 

当我调用本机方法“Hello”时,我得到了execption。

我观察到的另一件事是,当我使用命令行编译时:“cl -I”C:\ Program Files(x86)\ Java \ jdk1.7.0 \ include“-I”C:\ Program Files(x86)\ Java \ jdk1.7.0 \ include \ win32“-LD”C:\ Users \ administrator.RMDOM \ Documents \ Visual Studio 2008 \ Projects \ JNITrial \ JNITrial \ JNIInt.cpp“-FeJNITrial.dll”,一切正常。

我错过了Visual Studio设置中的内容吗? 我有选项使用MFC作为“在共享DLL中使用MFC”,代码生成选项为“multithreadingDLL(/ MD)”。 它是一个64位的DLL。 我还需要添加其他东西吗?

欢迎任何帮助。 提前致谢。

你能告诉我你使用的是什么类型的JVM,32位还是64位? 您的库是640位dll,但在您的路径中我可以看到C:\ Program Files(x86)…所以这可能就是问题所在。

我想出了解决方案。

我的项目使用了预编译头选项集,因此编译器正在跳过语句:

 #include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h" 

一旦我删除了该选项,它就像魔法一样。