这个问题与JNI %1 is not a valid Win32 application类似的问题有关。
我还想从C ++源代码编译一个64位静态库,以便在Java中使用,我也得到错误:
Exception in thread "Thread-2" java.lang.UnsatisfiedLinkError: C:\Users\boon\AppData\Local\Temp\keyboardhook-3382807930283923158.lib: %1 is no valid Win32 application
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at de.ksquared.system.keyboard.Native.load(Native.java:79)
at de.ksquared.system.keyboard.KeyboardHook.(KeyboardHook.java:84)
at de.ksquared.system.keyboard.PoolHook.run(KeyboardHook.java:51)
虽然我想从Kristian Kraljic(http://kra.lc/blog/2011/07/java-global-system-hook/)编译KeyboardHook,但在库中增加了一些功能。首先,我尝试使用Microsoft Visual Studio 2013编译我的KeyboardHook.cpp,但是Kristian建议的编译标志都被忽略了,我也得到了上面提到的相同的异常。因此,我将编译器更改为MinGW,并使用以下命令成功编译:
g++ -Wall -c -D_JNI_IMPLEMENTATION_ -Wl,-kill-at -O0 -g3 -fmessage-length=0 -static-libgcc -I”%JAVA_HOME%\include” -m64 -I”%JAVA_HOME%\include\win32″ -shared -o keylib.lib KeyboardHook.cpp
我从克里斯蒂安人建议中接过的大部分旗帜。问题似乎是生成的.lib文件似乎仍然不完全是64位。 gcc -dumpmachine
告诉我:x86_64-w64-mingw32
,因此32位和64位作为目标应该是可能的。使用标志-m64
它应该用64位编译,或者?我正在使用minGW构建x64-4.8.1-win32-seh-rev5
,Windows 7 64位和Java7。
我现在还不知道还有什么地方可以找到错误。我是否必须以不同方式设置链接器标志?
答案 0 :(得分:0)
在我自己的项目中,我使用以下标志:
-static-libgcc # Don't require to ship libgcc_s_seh-1.dll with your dll
-static-libstdc++ # Don't require to ship libstdc++-6.dll
-shared # As usual. Yeah, static+shared, Windows is beautiful
-Wl,--add-stdcall-alias # The JVM expects _stdcall decoration while mingw produces
# _cdecl. You could use -Wl,-kill-at but this one is clear
-m64 # I need 64 bits binary code for my 64 bits JVM
我的完整代码可用on GitHub。