记录下这几天用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);// 等效于jna.protected=true,这项设置会使本地方法发生异常时生成java异常,如果为false则本地方法发生异常时会使jvm崩溃,无法try-catch,默认false,注意此方法只适合在windows上测试时使用
NativeLibrary.addSearchPath("Hello", "D:\\Hello");// 注意这里参数一不带dll后缀,参数二是文件所在的文件夹路径而不是文件路径
Hello hello = (Hello) Native.loadLibrary("Hello", Hello.class);
System.out.println(Arrays.toString(hello.hello()));
}
}

Native.loadLibrary(String, Class);

这个方法第一个参数填加载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

最新文章

  1. Sql Server系列:Delete语句
  2. LINQ LINQ Operators and Lambda Expression - Syntax & Examples
  3. linux下访问中文目录文件
  4. excute和query
  5. 研究AVCaptureDevice
  6. linux内核--进程与线程
  7. JAVA数据库处理(连接,数据查询,结果集返回)
  8. iOS开发——适配篇&iOS9适配
  9. 查看编译后的calss文件编译jdk版本
  10. 基本RC积分电路及原理分析
  11. Photoshop 钢笔 双窗口显示
  12. 门面(Facade)模式
  13. 整理spring定时器corn表达式
  14. C#如何拦截 Webbrowser Control的响应内容
  15. pdf生成库-libharu编译
  16. Python读取excel表的数据
  17. [NOI2018]你的名字(后缀自动机+线段树)
  18. pyCharm添加自己的快捷代码
  19. 把router-link标签渲染成指定的标签
  20. jdk 环境

热门文章

  1. mmap:速度快+整块操作
  2. linux 系统信息展示 htop glances conky psensor
  3. D. Concatenated Multiples(离线处理)
  4. android系统中如何通过程序打开某个AccessibilityService
  5. loadrunner迭代和并发的区别
  6. .Net Core应用框架Util介绍(六)
  7. codeforces#983 B. XOR-pyramid (dp)
  8. 关于H5页面中生成图片的两种方式!
  9. How to DUMP the vba code protected by Unviewable+ VBA?
  10. android_模拟器调试