JNI UnsatisfiedLinkError для собственного метода

Я использую 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 <jni.h>
/* 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 <jni.h>
#include <windows.h>
#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<jdk_dir>\include -I<jdk_dir>\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)

person nuju    schedule 23.04.2012    source источник
comment
Я не внимательно изучил ваш код, но не рассматривали ли вы вместо этого использование JNA? Тогда вам не придется беспокоиться о недружелюбии JNI.   -  person rob    schedule 23.04.2012
comment
Даже не знал, что JNA существует. Я посмотрю на это. Спасибо :)   -  person nuju    schedule 23.04.2012
comment
Какое имя пакета вы используете в своем Java-коде?   -  person ioums    schedule 02.05.2012
comment
@rob Я использовал JNA (Java Native Access). Это очень полезно и гибко!   -  person nuju    schedule 26.08.2012
comment
@nuju рад, что тебе это помогло! Обязательно распространяйте информацию, когда слышите, как кто-то упоминает JNI или UnsatisfiedLinkError. JNI имеет свое место, но использование JNA не так болезненно.   -  person rob    schedule 31.08.2012
comment
Было бы неплохо, если бы вы могли отметить мой ответ как правильный, если он действительно решает вашу проблему. Спасибо!   -  person stippi    schedule 22.07.2015


Ответы (1)


После того, как полдня погуглил и погуглил, чтобы решить одну и ту же проблему, я обнаружил, что GCC не генерирует библиотеки DLL, в которых JVM может разрешать символы. Но можно передать GCC правильные аргументы командной строки, и тогда все заработает:

См. эту запись MinGW на эту тему. Нужно передать "-D_JNI_IMPLEMENTATION_ -Wl,--kill-at" в качестве дополнительных флагов. Не знаю, нужны ли они все или только первый бит.

person stippi    schedule 05.09.2012
comment
Вы, сэр, заслуживаете большего внимания. Я полдня пытался разобраться. Собирался задать аналогичный вопрос на SO, когда увидел ваш ответ. - person 301_Moved_Permanently; 17.07.2015