Проблема в запуске очень простого теста JNI Hello World - PullRequest
1 голос
/ 08 апреля 2011

EDIT3: Вызывает проблему вызывающие флаги компилятора, если я компилирую из командной строки, используя компилятор Microsoft, он работает нормально. Кто-нибудь знает, что мне нужно изменить в code :: blocks, чтобы исправить эту проблему?

Когда я запускаю свой код, я получаю UnsatisfiedLinkError. Шаг загрузки работает нормально, я получаю сообщение об ошибке, когда он на самом деле вызывает код.

Начал с пути к моей dll

java -Djava.library.path=E:\Java\JNIHellowWorld\PasswordGenHW\bin\Debug -jar dist\JNIHellowWorld.jar

Исключение

Exception in thread "main" java.lang.UnsatisfiedLinkError: jnihellowworld.Main.HelloWorld()Ljava/lang/String;
        at jnihellowworld.Main.HelloWorld(Native Method)
        at jnihellowworld.Main.main(Main.java:16)

Java-код

package jnihellowworld;
import java.io.IOException;
public class Main {
    public native String HelloWorld() throws Error;
    public static void main(String[] args) throws IOException {
        try
        {
        System.loadLibrary("PasswordGenHW");
        String test = new Main().HelloWorld(); //errors on this line
        System.out.println(test);
        System.in.read();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

C ++ header

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnihellowworld_Main */

#ifndef _Included_jnihellowworld_Main
#define _Included_jnihellowworld_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jnihellowworld_Main
 * Method:    HelloWorld
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

C ++ cpp

#include "jnihellowworld_Main.h"
#include <jni.h>

JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
  (JNIEnv *env, jobject obj)
  {
      return env->NewStringUTF("Hello world!");
  }

Я использую Code :: Blocks и GCC для завершения dll.

РЕДАКТИРОВАТЬ: Вот мусорная корзина / экспорт DLL

2    1 000011D8 Java_jnihellowworld_Main_HelloWorld@8

EDIT2: упрощенный проект для дублирования ошибок с использованием system.loadLibrary ()

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

В итоге я просто скомпилировал вручную с помощью компилятора Microsoft.

0 голосов
/ 29 июля 2011

Попробуйте добавить эти флаги при компиляции и при связывании:

-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at

Пример:

gcc -c -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.c

gcc -shared -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.o -o mylib.dll
...