本人菜鸟一枚,近日在编写公司代码时用到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);
}

解决方案暂时还没找到,我先把这个错误记录下来