本人菜鸟一枚,近日在编写公司代码时用到Java整合C的项目,需要使用JNA对C进行底层调用,但是在进行中出现了问题。
起初我用的是64位jdk,在运行时报错:1% 不是有效的Win32应用程序,
后来经过百度,将64位jdk换成了32位的,该错误消失,但是变成了
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'watermark': Native library (win32-x86/watermark.dll) not found in resource path ([file:/G:/Java-EE%20Workspace/eid-server-watermark_1/target/classes/])
比较奇怪的是我的dll文件(该文件放在了source目录下了)编译之后成功出现在了target/classes目录下,并且我调用的是Win32-x86-64,理论上应该用的就是64位的jdk。另外我师傅运行这段代码在64位的jdk下没问题!!!
主函数代码如下:
public static void main(String[] args) {
//执行嵌入
String em_msg = "jjrt";
int result = Watermark.INSTANCE.watermark_embed("d://watermark_.png",
"d://watermark_.png", "d://logo.png", em_msg, em_msg.length());
System.out.println(result);
}
接口代码如下:
public interface Watermark extends Library {
Watermark INSTANCE = (Watermark) Native.loadLibrary("watermark", Watermark.class);
/**
* 嵌入水印.
*
* <p>
* 注意事项:请检查输入输出路径是否存在,是否可写可读。请检查输入路径对应文件是否存在
* 调用前请自行分配字节串数组内存空间,请保证输入数组长度与实际数组长度一致 载体图像为RGB彩色图像(BMP、PNG),
* 颜色空间位深8bit logo图像为二值图像(PNG)
* </p>
*
* @param output_imgfile_path 水印图像输出路径
* @param input_imgfile_path 载体图像输入路径
* @param input_logo_path logo图像输入路径
* @param msg 字节串数组首地址
* @param num_msg_bit 字节串数组长度
*
* @return int
*/
int watermark_embed(String output_imgfile_path, String input_imgfile_path,
String input_logo_path, String msg, int num_msg_bit);
/**
* 提取水印.
*
* 注意事项: 含水印图像为RGB彩色图像(BMP、PNG),颜色空间位深8bit 其余同嵌入函数注意事项
*
* @param input_imgfile_path 水印图像输入路径
* @param output_logo_path logo图像输出路径
* @param logo_height 提取水印图像的高度
* @param logo_width 提取水印图像的宽度
* @param num_msg_bit 字节串数组长度
* @param msg 字节串数组首地址
*
* @return int
*/
int watermark_extract(String input_imgfile_path, String output_logo_path,
int logo_height, int logo_width, int num_msg_bit, byte[] msg);
}
解决方案暂时还没找到,我先把这个错误记录下来