首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNI UnsatisfiedLinkError

JNI UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2011-11-17 19:26:45
回答 2查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
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)

生成的头文件为:

代码语言:javascript
复制
/* 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

实现文件为:

代码语言:javascript
复制
#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文件是:

代码语言:javascript
复制
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 "C:\Users\administrator.RMDOM\Documents\Visual”C:\Program Files (x86)\Java\jdk1.7.0\include“-I"C:\Program Files (x86)\Java\jdk1.7.0\include\win32”-LD -I-I 2008\Projects\JNITrial\JNITrial\JNIInt.cpp“-FeJNITrial.dll”,一切正常。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-21 18:25:16

我想出了解决方案。

我的项目设置了使用预编译头选项,因此编译器跳过了以下语句:

代码语言:javascript
复制
#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"

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

票数 0
EN

Stack Overflow用户

发布于 2011-11-17 19:33:43

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8166324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档