博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hello jna
阅读量:7071 次
发布时间:2019-06-28

本文共 1592 字,大约阅读时间需要 5 分钟。

记录下这几天用jna3.5.0调c++写的dll的经历

os:win7

用jna调dll首先需要一个dll文件并有可调的方法,然后根据方法的名称,参数,返回值编写一个interface

c++需要包含一个头文件,方法需要用extern "C" __declspec(dllexport)修饰

c与java类型的对应关系详见https://java-native-access.github.io/jna/3.5.0/javadoc/的Marshalling/Unmarshalling (Java/Native Type Conversions)这一节

example:

Hello.h

extern "C" __declspec(dllexport) char** hello();

Hello.cpp

char** hello(){    char** result = new char*[3]    result[0] = "123";    result[1] = "321";    result[2] = NULL;// 注意,数组的最后一个元素必须为NULL    return;}

以上是c++源码,打包成Hello.dll放到某个目录下,比如这里移动到D:\Hello\Hello.dll,注意平台要选择x64,否则64位jdk可能会找不到库

Hello.java

public interface Hello{    String[] hello();}

Main.java

public class Main{    public static void main(String[] args){        Native.setProtected(true);// 这项设置会使本地方法发生异常时生成java异常,如果为false则本地方法发生异常时会使jvm崩溃,无法try-catch,默认false        NativeLibrary.addSearchPath("Hello", "D:\Hello");// 注意这里参数一不带dll后缀,参数二是文件所在的文件夹路径而不是文件路径        Hello hello = (Hello) Native.loadLibrary("Hello", Hello.class);        System.out.println(Arrays.toString(hello.hello()));    }}

这个方法第一个参数填加载dll的名称,不含.dll后缀。

搜索dll的路径是:1)项目的根路径2)操作系统的全局路径、3)path指定的路径。

摘自https://blog.csdn.net/jimmy609/article/details/19076557

这里因为调用了addSearchPath方法所以不用在乎这些限制,dll可以放在任意位置

配合visual studio调试:

首先dll需要以debug模式编译,然后以debug模式运行java,在调用本地方法之前打好断点,在vs中选择调试-附加到进程,选择java的进程,进程id可以通过ManagementFactory.getRuntimeMXBean.getName()方法看到,前面的数字就是进程id,在vs中打好断点,放开java的断点就可以进来了。

另外提一句,String和char**之间会根据jna.encoding(默认utf8)转换,而中文系统是用的GBK编码,中文会乱码,可以通过手动设置jna.encoding参数解决,不过这里推荐使用wchar_t替换char,WString替换String

转载于:https://www.cnblogs.com/DXDE443/p/9951592.html

你可能感兴趣的文章
swap函數 进阶探讨与实现
查看>>
PLSQL Developer过期要注冊表
查看>>
JavaScript中call,apply,bind方法的总结。
查看>>
Ajax、Comet与Websocket
查看>>
Python输出中文乱码问题
查看>>
HDU 5655 CA Loves Stick 水题
查看>>
EventBus (四) Sticky事件
查看>>
linux Shell编程
查看>>
ZeroMQ(java)之I/O线程的实现与组件间的通信
查看>>
javascript获取当前的时间戳
查看>>
【架构】微服务系列文章
查看>>
Eclipse:The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
查看>>
PAT1005
查看>>
深入理解java的抽象类和接口(转载)
查看>>
HTML元素坐标定位,这些知识点得掌握
查看>>
【服务器环境搭建-Centos】jdk的安装
查看>>
mysql主从复制的配置总结
查看>>
three.js正交投影照相机
查看>>
构建自己的PHP框架--构建模版引擎(1)
查看>>
Linux之一次性安装开发工具:yum groupinstall Development tools
查看>>