我正在尝试使用JRE 1.7在Windows上加载本机库。这是我加载库的代码:
public boolean loadNativeLibrary(String libName){
try{
String libPath = RLibLocator.locateLibrary(libName);
File tmpLibPath = File.createTempFile("lib", ".dll");
InputStream libIn = PlatformGeneric.class.getClassLoader().getResourceAsStream(libPath);
byte[] decrypted = AES.decrypt(StreamUtils.readAll(libIn), RLibLocator.LIB_DATA_KEY);
FileOutputStream fout = new FileOutputStream(tmpLibPath);
fout.write(decrypted);
fout.flush();
libIn.close();
fout.close();
tmpLibPath.deleteOnExit();
System.load(tmpLibPath.getAbsolutePath());
return true;
}catch(Exception e){
Log.e("Platform/LibLoader", "Failed to load library: Exception: " + e.getClass().getName() + ": " + e.getMessage());
if(DEBUG)
e.printStackTrace();
}
return false;
}
如您所见,正在加载的库已加密,然后在运行时解密并使用System.load
加载。但是,在运行此代码时,pplication会抛出NoSuchMethodError
。堆栈跟踪如下:
Exception in thread "main" java.lang.NoSuchMethodError: <init>
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 PlatformGeneric.loadNativeLibrary(PlatformGeneric.java:225)
...
我已经检查过存储在临时文件夹中的解密库与未加密的,最初编译的二进制文件(散列匹配)相同。我试图加载的库肯定没有错误,可以在这里找到源代码:https://github.com/kwhat/jnativehook。
我在这里做错了吗?如果是这样,我该如何解决这个问题?
注意: 我尝试使用多个JRE(1.5-1.8)来运行它。