1.主机,javajdk,dll文件兼容性问题
主机 dll jdk 可行
32位 32位 32位 1
32位 64位 32位 0
64位 32位 32位 1
64位 64位 32位 0
64位 32位 64位 0
64位 64位 64位 1
2.生成dll文件时选择生成64位,可能生成的还是32位,注意查看dll文件位数确保正确后再给jna调用
解决办法:找其他的demo生成64位dll,确保可以生成后再集成需要的代码生成64位dll。
3.jna调用时需要注意:涉及到文件读取的dll文件,加载调用后记得及时销毁,否则后续再次调用会报错。
销毁方法:instance.dispose();
4.如果报错找不到模块说明dll加载地址有问题,尝试使用静态路径加载
5.如果报错%1win32说明是兼容性问题,参考第一条
引入jar包:
net.java.dev.jna jna 5.3.1参考代码:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
/**
-
JNA框架DLL动态库读取调用示例类
-
@ClassName: DllCall
-
@Description: 读取调用DLL动态库文件中的方法
/
public class JNADllCall {
/*-
DLL动态库调用方法
-
@Description: 读取调用CDecl方式导出的DLL动态库方法
-
@author: 管
-
@date: 20200325
*/
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(“Project3”, CLibrary.class);// 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库Project3.dll中的show(),add()方法)
int show(String url);
double add(double a, double b);
}
public void work(String imgurl){
try{ NativeLibrary instance = NativeLibrary.getInstance("Project3"); instance.getFunction("show").invokeString(new Object[]{imgurl},true); instance.dispose(); } catch (Exception e){ e.printStackTrace(); }
}
public static void main(String[] args) {
JNADllCall jnaDllCall = new JNADllCall();
jnaDllCall.work(“D:/imagetest/imgurl2.txt”);
}
} -