3

更新: DLL アセンブリをチェックアウトすると、プログラムは次のように DLL のエラーを示します。

エラー: 暗黙的に依存するモジュールにエクスポート関数がないため、少なくとも 1 つのモジュールに未解決のインポートがあります。エラー: CPU タイプが異なるモジュールが見つかりました。

私は2日間JNI実装を開発しようとしています...

私のラップトップは x64 です。マシンには x64 と x86 の両方の Java がインストールされています。ただし、Java 環境変数は x64 バージョンに設定されています。

私はx86 Java、コンパイル、ヘッダー生成に関するすべての作業を行っており、vs2010でwin32用のdllをコンパイルしています

まず、Java クラスを次のようにコーディングします。

Ex1.java

public class Ex1 {
    // Load the dll that exports functions callable from java
    static {System.loadLibrary("ex1");}

    public native void startProcess();

    public void Test() {
    }

    public static void main(String [] args) {
        Ex1 t = new Ex1();
        t.startProcess();
    }

}

次に、このJavaファイルをx86 javacでコンパイルします

「C:\Program Files (x86)\Java\jdk1.7.0_05\bin\javac.exe」 Ex1.java

次に、x86 javah でヘッダーを生成します

「C:\Program Files (x86)\Java\jdk1.7.0_05\bin\javah.exe」 例1

Ex1.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Ex1 */

#ifndef _Included_Ex1
#define _Included_Ex1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Ex1
 * Method:    startProcess
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Ex1_startProcess
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

次に、新しい Win32 プロジェクトを開始し、vs2010 で dll と空のプロジェクトに設定します。そして、javahで生成されたヘッダーファイルをヘッダーファイルに追加し、ヘッダーファイルと同じ名前のcppファイルを作成してから、関数を次のように実装します:

Ex1.cpp

#include <jni.h>

JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv * env, jobject job){
    return;
}

次に、プロジェクトをex1.dllとしてコンパイルします

次に、次のファイルを C:/jni1/ にまとめます。

  • ex1.h
  • ex1.java
  • ex1.クラス
  • ex1.dll

最後に、次のコマンドを実行します。

"C:\Program Files (x86)\Java\jdk1.7.0_05\bin\java.exe" -classpath .; 例1

次に、このエラーが発生します。

スレッド「メイン」での例外 java.lang.UnsatisfiedLinkError: Ex1.startProcess()V
at Ex1.startProcess (ネイティブ メソッド)
at Ex1.main (ex1.java:20)

4

1 に答える 1

0

あなたの 32 ビット DLL はシステム DLL に依存しており、SysWoW64 にある 32 ビットではなく、名前にもかかわらず 64 ビットである System32 からのものを使用しようとしていると思います。証拠として、DLL を 64 ビットとしてコンパイルし、64 ビット JVM で実行しようとします。それは箱から出してすぐに動作するはずです。ただし、32 ビット DLL に 32 ビットの依存関係を強制的に使用させることはできません。JNI DLLが存在する場所へのファイルのトリッキーなコピーや、レジストリマジックが必要になる場合があります。ただし、32 ビット ツールを介した適切な DLL 登録で十分かもしれません。

于 2012-06-17T22:42:20.030 に答える