JNI を使用して Java プログラムから C コードにアクセスしようとしているテスト ケースがあります。必要な手順は次のとおりです。
1. ネイティブ メソッドを呼び出す Java プログラム :
public class RunnerClass{
public native void win32_svc_install();
static{
System.loadLibrary("testDll");
System.out.println("library loaded successfully");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new RunnerClass().win32_svc_install();
}
}
2..class
ファイルが生成され、対応する.h
ファイルが作成された後、ネイティブ メソッドの実装を.c
ファイル内に配置します。
/* DO NOT EDIT THIS FILE - it is machine generated */
//RunnerClass.h
#include <jni.h>
/* Header for class RunnerClass */
#ifndef _Included_RunnerClass
#define _Included_RunnerClass
#ifdef __cplusplus
extern "C" {
#endif/*
* Class: RunnerClass
* Method: nx_win32_svc_install
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install
(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif
このRunnerClass.c
ファイルには、ネイティブ メソッドの実装が含まれています。このメソッドが正確にServiceManager
行うことは、それを利用するためにウィンドウの を呼び出すことです。私の Java プログラムは、これらのアクションを実行する必要があります。
testDll.dll
が作成された後に問題が発生します。Java コードを解釈する前に、必要な library( testDll
)のライブラリ パスをjava.library.path
.
プログラムを実行すると、ライブラリが読み込まれますがUnsatisfiedLinkError
、ネイティブ メソッドにスローされます。正確なエラーは次のとおりです。
Exception in thread "main" hello ,java.lang.UnsatisfiedLinkError: RunnerClass.win32_svc_install(ILjava/lang/String;)V
at RunnerClass.win32_svc_install(Native Method)
at RunnerClass.main(MainWs.java:58)
私は多くの調査を行い、ロードされているライブラリでプログラムがネイティブメソッドの実装を見つけることができないため、例外がスローされることをはるかに理解しました。