2013-05-13 8 views
6

Witam Nie znalazłem rozwiązania, jak utworzyć 64-bitową bibliotekę dll. I używaj jego natywnych metod C++. Używam kod Java metodynatywne.java:Jak wygenerować 64-bitowy plik .dll, który kompilator GCC lub inny. Nie można załadować IA 32-bitowego pliku .dll na 64-bitowej platformie AMD.

class metodynatywne { 

static { 
    System.loadLibrary("metodynatywne"); 
} 
native public void sayHello(); 

public static void main (String argv[]) 
{ 
    new metodynatywne().sayHello(); 
} } 

następnie generowane metodynatywne.h użyciu javah -jni metodynatywne

pisałem kod metodynatywne.cpp:

#include <jni.h> 
    #include <iostream> 
    #include "metodynatywne.h" 
    using namespace std; 

    JNIEXPORT void JNICALL 
    Java_metodynatywne_sayHello(JNIEnv * env, jobject self) 
     { 
cout << "Hello World!" << endl; 
    } 

I ussed gcc utworzyć mój dll z opcjami:

c:\>c++ -I c:\java7\include -I c:\java7\include\win32 -c metodynatywne.cpp 

i

c:\>c++ -shared metodynatywne.o -o metodynatywne.dll 

i co co mi chodzi jest komunikat o błędzie:

c:\>java metodynatywne 
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Programowanie\UJ\Semestr2\ZPG\PerfCount\cwiczenie\metodynatywne.dll: Can't lo 
ad IA 32-bit .dll on a AMD 64-bit platform 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
    at java.lang.ClassLoader.loadLibrary1(Unknown Source) 
    at java.lang.ClassLoader.loadLibrary0(Unknown Source) 
    at java.lang.ClassLoader.loadLibrary(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at metodynatywne.<clinit>(metodynatywne.java:4) 

użyłem Java 1.4 32-bitowy kompilator javac i java7 x64 kompilator oba metods dał mi ten sam błąd. Jak sobie z tym poradzić? Użyj innego kompilatora C++, jeśli tak, wymuszenie tego kompilatora, aby utworzyć użyteczne przez mój plik dll Java. Pracuję na Windows 7 64 bit.

Jak mogę zrobić z pliku cpp 64-bitowe dll (z gcc)? Lub inny kompilator linii poleceń?

Bardzo dziękuję za wszelkie uwagi i pomoc.

+0

Mam ten sam problem, czy znalazłeś rozwiązanie? –

Odpowiedz

0

Powinieneś przekompilować bibliotekę DLL dla wersji 64-bitowej (musisz pobrać 64-bitowe narzędzia do kompilacji). Możesz także przełączyć się na 32-bitową maszynę JVM (wystarczy pobrać 32-bitową maszynę JVM).

0

Ta flaga kompilator powinien pomóc: C++ --64 -DARCH_X86_64 = 1 file.cpp

0

Jeszcze nie zaakceptowane odpowiedź na ten jeden, więc będę gryźć ... Jak wspomniano Denis, będziesz musisz pobrać 64-bitowy kompilator do generowania .dll. Obecnie większość ludzi używa MinGW-w64 do tego w systemie Windows (http://www.mingw.org lub bezpośrednio do pobrania tutaj http://sourceforge.net/projects/mingw-w64/files/latest/download?source=files), który ma całkiem niezły pakiet instalacyjny. Uwaga - jeśli nie korzystasz z pakietu instalacyjnego, musisz samodzielnie zainstalować cały pakiet narzędzi. Następnie używałbyś tego 64-bitowego pliku wykonywalnego kompilatora (np. "X86_64-w64-mingw32-g ++") zamiast 32-bitowego gcc do wygenerowania biblioteki.

Jak zauważyłeś powyżej, musisz uważać na wersję java, której używasz, aby upewnić się, że jest zgodna z architekturą skompilowanej biblioteki C++. Oznacza to zarówno automatyczne generowanie przez Javah nagłówka JNI, jak i środowisko wykonawcze Java, z którego je wywołujesz.

Powiązane problemy