Я использую Windows XP. Очевидно, JNI и UnsatisfiedLinkError идут рука об руку... Я заметил, что в большинстве случаев ошибка компоновщика выглядит так:
java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path
Но это не моя проблема; Java может найти мою DLL. Я получаю сообщение об ошибке, которое заставляет меня думать, что я неправильно назвал свой метод:
java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String;)Z
Я пытался просмотреть ряд похожих вопросов на StackOverflow, таких как этот , этот , этот , этот и этот , но ни один из этих методов не сработал. Я также нашел эту темуна форумах Ubuntu, где похоже, что у меня точно такая же проблема, но автор вопроса не сказал, как они решили свою собственную проблему (что действительно отстой). Все поиски в Google дали мне такую же ошибку, как и java.library.path.
Вот мой фактический код.
NativeTest.java
class NativeTest
{
public static native boolean nativemethod (String arg);
public static void main (String[] args)
{
System.out.println(nativemethod("0123456789"));
System.out.println(nativemethod("012"));
}
static { System.loadLibrary("NativeTest"); }
}
NativeTest.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class NativeTest */
#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeTest
* Method: nativemethod
* Signature: (Ljava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
NativeTest.c
#include
#include
#include "NativeTest.h"
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod
(JNIEnv* Jenv, jclass Jref, jstring Jarg)
{
MessageBox(NULL, "text", "title", MB_OK);
int len = (*Jenv)->GetStringLength(Jenv, Jarg);
return (jboolean)(len > 5);
}
В cmd.exe: (Команда gcc — это моя мешанина из различных команд, которые я нашел в Интернете.)
>javac NativeTest.java
>javah -jni NativeTest
>gcc -shared -I\include -I\include\win32 -oNativeTest.dll NativeTest.c -lgdi32
>java -Djava.library.path=. NativeTest
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z
at NativeTest.nativemethod(Native Method)
at NativeTest.main(NativeTest.java:8)
>java NativeTest
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z
at NativeTest.nativemethod(Native Method)
at NativeTest.main(NativeTest.java:8)