Технология JNI, не работает пример :(
Занялся изучением технологии JNI и столкнулся с проблемой. Мой пример не работает хотя код написан по всем правилам.
Код C++ библиотеки сгенерированный при помощи javah:
#include <windows.h>
#include <jni.h>
extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall(JNIEnv *, jobject);
И
#include "MyJavaPackage_NextLevelClass.h"
extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall
(JNIEnv *, jobject)
{
MessageBox(NULL,"TEST","TEST",MB_OK);
}
Есть класс в котором я определил внешний нейтивный метод:
package MyJavaPackage;
public class NextLevelClass{
static {
try{
System.load("G:\\Documents and Settings\\artiom\\My Documents\\NetBeansProjects\\MyDesktopApplication\\dist\\lib\\MyDynamicLibrary.dll");
}
catch(UnsatisfiedLinkError g)
{
System.out.print(g.getMessage() + " LIBRARY EXCEPTION");
}
}
private static native void ShowCall();
public void GiveIt()
{
try{
ShowCall();
}
catch(UnsatisfiedLinkError g)
{
System.out.print(g.getMessage() + " METHOD EXCEPTION\n");
}
}
}
Сам код в вызывающей программе выглядит следующим образом:
NextLevelClass NLC1 = new NextLevelClass();
NLC1.GiveIt();
В результате при выполнении библиотека сама загружается идеально, но при вызове метода ShowCall возникает исключение UnsatisfiedLinkError. Подскажите пожалуйста в чем может быть проблема?
Версия ОС:
Windows XP Service Pack 3
Версия JAVA (java -version):
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
Среда разработки (About окно):
Product Version: NetBeans IDE 6.1 (Build 200805300101)
Java: 1.6.0; Java HotSpot(TM) Client VM 1.6.0-b105
System: Windows XP version 5.1 running on x86; Cp1251; uk_UA (nb)
Userdir: G:\Documents and Settings\artiom\.netbeans\6.1
[ highlight=java] [ /highlight].
И стектрейс в студию.
Метод в Java объявлен как static а реализация в C имеет в сигнатуре jobject что характерно для не-статических методов. Убери jobject из сигнатуры Java_MyJavaPackage_NextLevelClass_ShowCall.