Java jna调用c++生成的dll文件资料整理

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”);
    }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过JNAJava Native Access)来调用C++的.h文件JNA是一个Java库,它允许Java应用程序在运行时动态地访问本地代码库,包括动态链接库(.dll)和共享对象(.so)。以下是使用JNA调用C++的.h文件的一些步骤: 1. 定义一个Java接口,该接口包含您要调用C++函数的声明。在Java接口中使用JNA提供的注释来指定函数的原型和库名称。例如: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; public interface MyLibrary extends Library { MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary", MyLibrary.class); int myFunction(int arg1, int arg2, Pointer arg3); } ``` 这个接口定义了一个名为MyLibrary的库,该库包含一个名为myFunction的函数,该函数接受两个整数参数和一个指向指针的指针参数。 2. 在Java代码中实现该接口。您需要实现接口中声明的所有方法。在实现方法时,您需要使用JNA的函数调用机制来调用C++函数。例如: ```java public class MyApp { public static void main(String[] args) { int arg1 = 123; int arg2 = 456; byte[] buffer = new byte[1024]; Pointer arg3 = new Memory(buffer.length); int result = MyLibrary.INSTANCE.myFunction(arg1, arg2, arg3); String message = new String(arg3.getByteArray(0, result)); System.out.println(message); } } ``` 这个例子展示了如何调用myFunction函数,并将一个指针参数传递给它。在这个例子中,我们使用JNA的Memory类来创建指针参数。 3. 使用C++编译器将你的.h文件编译成动态链接库(.dll或.so文件),并将其放置在Java代码可以访问的位置。 4. 运行Java代码,并检查它是否能够正确地调用C++函数。 这是一个基本的示例,可以让您开始使用JNA调用C++的.h文件。但是请注意,这只是一个概述,实际上可能需要更多的工作来使它正常工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值