JNI привет мировая неудовлетворенная ошибка ссылки

Работайте ниже команды в терминале

xdg-open ~/.local/share/applications

, Ищут связанные с вином файлы как wine-extension-chm.desktop, wine-extension-txt.desktop, wine-extension-xml.desktop.... и удаляют их.

How to get rid of wine programs in the right click context menu?

, После того как это сделало Вас, не должен видеть ни одну из связанных с вином программ в контекстном меню щелчка правой кнопкой.

12
задан Ashley Medway 10 May 2014 в 21:05
поделиться

3 ответа

Я не претендую на понимание ситуации в достаточной степени, чтобы объяснить ее, однако некоторые пользователи сообщали об ошибке при использовании флага компилятора «-MD».

Для получения дополнительной информации см. Собственный интерфейс Java (JNI) - невозможно использовать VS2005 с Java? , в котором обсуждается эта проблема и предлагаются возможные решения, а также блог техников для поиска альтернатив.

3
ответ дан 2 December 2019 в 21:03
поделиться

Я считаю, что вам следует использовать

System.loadLibrary("HelloWorld");

вместо System.load. LoadLibrary проверит ваш системный путь (а не путь к библиотеке Java), поэтому убедитесь, что HelloWorld.dll находится в каталоге, в котором он может быть найден. Также обратите внимание, что для этого не требуется полный путь, и вам не нужно добавлять расширение dll в конец.

1
ответ дан 2 December 2019 в 21:03
поделиться

Ошибка неудовлетворенного соединения может означать, что многие вещи пошли не так. Я бы использовал

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.dll

Затем, чтобы запустить код:

java -Djava.library.path =. CallApi

9
ответ дан 2 December 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: