更新: 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)