0

シンプルな JNI レイヤーを作成したいと考えています。Visual Studio 2008 を使用して dll (オプションとして DLL を使用した Win 32 コンソール アプリケーション プロジェクト タイプ) を作成しました。ネイティブメソッドを呼び出すと、次の例外が発生します。

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」を呼び出すと、実行が発生します。

私が観察したもう 1 つのことは、次を使用してコマンド ラインでコンパイルすると次のようになることです。 jdk1.7.0\include\win32" -LD "C:\Users\administrator.RMDOM\Documents\Visual Studio 2008\Projects\JNITrial\JNITrial\JNIInt.cpp" -FeJNITrial.dll" 、すべて正常に動作します。

Visual Studio の設定で何か不足していますか? 「共有DLLでMFCを使用する」としてMFCのオプションを使用し、「マルチスレッドDLL(/ MD)」としてコード生成オプションを使用します。その64ビットdll。他に追加する必要があるものはありますか?

どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

0

私は解決策を考え出しました。

私のプロジェクトはプリコンパイル済みヘッダー オプション セットを使用していたため、コンパイラはステートメントをスキップしていました。

#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"

そのオプションを削除すると、魔法のように機能しました。

于 2011-11-21T10:25:16.087 に答える
0

使用している JVM の種類 (32 ビットまたは 64 ビット) を教えてください。ライブラリは 640 ビット dll ですが、パスに C:\Program Files (x86) が表示されるので、これが問題なのかもしれません。

于 2011-11-17T11:33:42.737 に答える