2012-12-08 53 views
1

我使用GCC標誌-c和-o Name.dll在Windows(64位)上編譯了本機DLL文件。JNI:編譯64位本機庫的問題

當我做System.load( 「fullpahhere」),我得到這個錯誤:

java.lang.UnsatisfiedLinkError: RenderControl.dll: %1 is not a valid Win32 application 

如果我重新編譯添加一個空的main()方法的C源代碼和刪除-c標誌,它然後使用UnsatisfiedLinkError失敗,說明它無法在64位機器上加載32位DLL。

爲什麼Java調用沒有main方法的DLL無效?這不是毀了DLL文件和JNI的全部點嗎?

更新

我固定在main()的問題。這GCC調用設置工作:

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I "C:\Program Files\Java\jdk1.6.0_32\include" -I "C:\Program Files\Java\jdk1.6.0_32\include\win32" -shared *.c -o lib.dll 

我還需要弄清楚的JVM架構的問題,但是。

我在哪裏可以找到能夠編譯64位代碼的MinGW安裝?看來我的標準MinGW安裝只有32位。

如果我能掌握這一點,我該如何決定在Java中加載哪個庫?是否有一個系統屬性顯示JVM拱門不是的OS拱)?

回答

1

如果您使用MinGW32編譯器,則無法生成64位代碼。這是最有可能的故意。與我快速查找的其他人發生的類似問題似乎表明您正嘗試使用64位Java的32位本機二進制文件。

嘗試使用mingw-w64進行編譯,看看是否可以解決問題。

還有一種可能性,即您的庫不在庫路徑中,即使您給出了完整路徑System.load也沒有找到它,在這種情況下,您應該確保您的DLL處於正確的本地圖書館的位置。

+0

我正在查看MinGW-w64,並且我確實下載了它,但我無法弄清楚如何安裝它? (我有一個zip文件的Windows 64位下載 - 不幸的是沒有安裝exe文件...) – bgroenks

+0

哦,當然,他們只有linux二進制文件。 – 2012-12-08 22:44:41

+0

你也知道爲什麼DLL被標記爲無效,如果沒有main()? – bgroenks

1

查看http://tdm-gcc.tdragon.net/,下載TDM-GCC,可以在Windows上爲上述引用的MinGW-w64輕鬆安裝。您可以使用以下代碼在installint TDM-GCC之後生成64位dll。

"C:\MinGW64\bin\gcc.exe" -m64 -c -I"C:\Program Files\Java\jdk1.6.0_26\include" -I"C:\Program Files\Java\jdk1.6.0_26\include\win32" HelloWorld.c 

這是「-m64」,它使64位。這與HelloWorld.c C代碼源文件在同一目錄下運行。這生成與運行在同一目錄中的HelloWorld.o C代碼對象文件。