我想创建一个简单的JNI层。我使用Visual Studio 2008创建了一个dll(带有DLL作为选项的Win 32 Console Application项目类型)。我在调用本地方法时收到此异常:
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 <jni.h> /* 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”时,我得到执行。
我观察到的另一件事是,当我使用以下命令在命令行中进行编译时:“ 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”,有的代码生成选项为“多线程DLL(/ MD)”。它是一个64位dll。还有什么需要补充的吗?
欢迎任何帮助。提前致谢。
我想出了解决方案。
我的项目使用了预编译头选项集,因此编译器跳过了以下语句:
#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"
一旦我删除了该选项,它就像魔术一样工作。