JNI UnsatisfiedLinkError

JNI UnsatisfiedLinkError

本文关键字:UnsatisfiedLinkError JNI      更新时间:2023-10-16

我想创建一个简单的JNI层。我使用Visual studio 2008创建了一个dll (win32控制台应用程序项目类型,dll作为选项)。当我调用本机方法时,我得到这个异常:

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"时,我得到了异常。

我观察到的另一件事是,当我在命令行中使用:C:Program Files (x86)Javajdk1.7.0include" -I"C:Program Files (x86)Javajdk1.7.0includewin32" -LD "C:Usersadministrator。RMDOMDocumentsVisual Studio 2008ProjectsJNITrialJNITrial JNITrial. cpp" -FeJNITrial.dll ",一切正常

我在Visual Studio设置中错过了什么吗?我可以选择使用MFC作为"在共享DLL中使用MFC",代码生成选项为"多线程DLL (/MD)"。它是一个64位的dll。还有什么需要我补充的吗?

欢迎任何帮助。

你能告诉我你用的是哪种JVM吗,32位还是64位?你的库是640位的dll,但在你的路径中我可以看到C:Program Files (x86)…也许这就是问题所在

我找到解决办法了。

我的项目使用预编译头选项集,所以编译器跳过语句:

#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"

一旦我删除了这个选项,它就变魔术了。