Ошибка неудовлетворенной связи может означать, что многие вещи пошли не так. Я бы использовал
System.loadLibrary("HelloWorld");
Вместо
System.load();
Как предложил TwentyMiles.
Кроме того, при вызове вашей программы вам нужно (при условии, что ваша DLL находится в том же каталоге, что и ваши файлы классов:
java -Djava.library.path =. HelloWorld
Вот простая демонстрация, которую я сделал, которая вызывает функцию Win32 API (MessageBox)
класс Java
class CallApi{
private native String showMessageBox(String msg);
private native double getRandomDouble();
static{
try{
System.loadLibrary("CallApi");
System.out.println("Loaded CallApi");
}catch(UnsatisfiedLinkError e){
//nothing to do
System.out.println("Couldn't load CallApi");
System.out.println(e.getMessage());
}
}
public static void main(String args[]){
CallApi api = new CallApi();
double randomNumber = api.getRandomDouble();
String retval = api.showMessageBox("Hello from Java!\n"+
"The native random number: "+randomNumber);
System.out.println("The native string: "+retval);
}
}
Сгенерированный заголовочный файл
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CallApi */
#ifndef _Included_CallApi
#define _Included_CallApi
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallApi
* Method: showMessageBox
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *, jobject, jstring);
/*
* Class: CallApi
* Method: getRandomDouble
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Код C DLL
#include "CallApi.h"
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#pragma comment(lib,"user32.lib")
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *env, jobject thisObject, jstring js)
{
//first convert jstring to const char for use in MessageBox
const jbyte* argvv = (*env)->GetStringUTFChars(env, js, NULL);
char* argv =(char *) argvv;
//Call MessageBoxA
MessageBox(NULL, argv, "Called from Java!", MB_ICONEXCLAMATION | MB_OK);
return js;
}
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *env, jobject thisObject)
{
double num1;
srand((unsigned)(time(0)));
num1 = ((double)rand()/(double)RAND_MAX);
return num1;
}
Инструкция по компиляции
Я компилирую с Visual C ++ Express 2008 cl, удаляя флаг -ML, так как это вызывает исключение, когда код Java пытается вызвать собственный код:
cl / I "c: \ Program Files \ Java \ jdk1.6.0_10 \ include" / I "c: \ Program Files \ Java \ jdk1.6.0_10 \ include \ win32" -LD CallApi.c -FeCallApi. длл
Затем запустите код:
java -Djava.library.path =. CallApi