JNI UnsatisfiedLinkError - PullRequest
       68

JNI UnsatisfiedLinkError

0 голосов
/ 17 ноября 2011

Я хочу создать простой слой JNI.Я использовал Visual studio 2008 для создания dll (тип проекта Win 32 Console Application с 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», я получаю исключение.

Еще одна вещь, которую я заметил, это то, что, когда я компилирую в командной строке, используя: «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 как «Использовать MFC в общей DLL», опция «Генерация кода» как «Многопоточная DLL (/ MD)».Это 64-битная DLL.Есть ли что-то еще, что мне нужно добавить?

Любая помощь приветствуется.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Я разобрался с решением.

В моем проекте использовался набор параметров скомпилированных заголовков, поэтому компилятор пропустил оператор:

#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"

Как только я убрал эту опцию, она работала как волшебство.

0 голосов
/ 17 ноября 2011

Не могли бы вы сказать, какой тип JVM вы используете, 32- или 64-битный?Ваша библиотека - 640-битная DLL, но по вашему пути я вижу C: \ Program Files (x86) ... так что, возможно, в этом проблема.

...