java 调用.dll组件

这几天同事调用.dll文件出现各种问题, 在下闲来无事,也来玩玩,碰到的问题做个记录,指不定哪天就能用上,休洛洛洛~

java调用.dll组件几种方式(JNI&JNATIVE&JNA)

  • JNI

    • JNI不要额外导入jar包,内置引用就可;
    • 需要注意几点也是JNI调用的短板吧:
      • 编写c++ .dll中 需要引入java生成的.h文件 **重点要考圈起来
        类似于规定了一种特定语法,需要编辑C端代码
    • https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html
  • JNATIVE

    • 环境配置
    • 代码调用
    • 测试
  • JNA

    • https://blog.csdn.net/shendl/article/details/3589676
  • .dll文件生成

    • https://blog.csdn.net/little_bobo/article/details/55100660

JNI

JNATIVE
1.下载JNATIVE jar包 根据系统选择.dll/.so 文件,将其中的JNativeCpp.dll拷贝到system32文件夹中,libJNativeCpp.so是linux平台使用的(以下只描述.dll .os同理)
2.将jnative jar和 包导入现有工程,或copy至jdk/jre/lib/ext下

3.编写测试代码

package main.com.java;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;

/**
 * @Auther: jyb
 * @Date: 2018/8/31 14:31
 * @Description:
 */
public class JnativeTestDll {


    public static void main(String[] args) {
        //加载.dll文件
//        System.loadLibrary("hellodll");
        JNative getUrl;
        try {
            //调用dll库,第一个参数为dll名字  第二个参数为dll库中函数的名字
//           getUrl = new JNative("DolphinM2RobotNetCtrl", "_NET_ROBOT_PTZLightControl@4");
             getUrl = new JNative("hellodll", "?Add@MyMathFuncs@MathFuncs@@QAENNN@Z");
            double f1 = 2.3;
            double f2 = 3.7;
            //定义函数返回值类型
                getUrl.setRetVal(Type.DOUBLE);
                getUrl.setParameter(0, Type.DOUBLE, "2.3");
                getUrl.setParameter(1, Type.DOUBLE, "3.7");
            //执行所调用的函数
                 getUrl.invoke();

            //获取所调用的函数的返回值
            System.out.print( getUrl.getRetVal());

        } catch (Exception e) {

            e.printStackTrace();
        }

    }


}
4. 运行测试  

java 调用.dll组件_第1张图片

问题总结:

  • org.xvolks.jnative.exceptions.NativeException: Function xxx not found
    调用的.dll函数名称是经过编译后的优化名称,这也是与JNI调用的函数名称不同之处,
    如果遇以上错误则需要考虑该问题,可使用eXeScope工具打开.dll文件查看导出的函数名称是否与调用的一致;

  • java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library
    .dll访问环境有问题, 检查.dll是否放入系统环境变量中 ,如jdk/bin目录下

  • java.lang.UnsatisfiedLinkError: TestDll.NET_ROBOT_PTZLightControl(Ljava/lang/Short;)I
    请求方法名称不对应

  • 不是32位应用程序
    1.检查.dll是32还是64位
    2.jdk版本为32/64位
    3.保持 jdk版本与.dll版本一致

你可能感兴趣的:(java)