记录下这几天用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

Hello jna的更多相关文章

  1. JNA 如何 加载多个 存在依赖的 DLL 库

    JNA 的出现,极大的简化了原有的 JNI 技术.下面是JNA github地址:https://github.com/java-native-access/jna 1. 简单的一个例子: /** S ...

  2. 使用jna调用dll,jdk位数和dll位数的关系

    最近在学习jna,发现dll文件能能否成功调用取决于jdk位数. 32位jdk只能使用32位的dll,64位jdk只能使用64位的dll,否则位数不对应的话报的错是 "Exception i ...

  3. JNA开发中的问题积累

    [Qboy原创] 2013年12月28日 在开发一个项目过程中需要调用第三方的C的dll.由于是第一次在项目中使用JNA,很多都安装开发文档来做,但是出现了很多的问题. 由于很多接口还没调完,还不知道 ...

  4. JNA使用

    JNA与C对应的数据类型: 注意:        使用byte[]对应C++中的char* 可以返回函数执行的结果值 一.添加JNA需要的jar包      1.jna.jar      2.plat ...

  5. JNA参数传递问题,Java数组

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法. C语言结构体定义如下: typedef struct Rect { in ...

  6. JNA结构体参数传递,Java数组

    JNA以结构体数组为参数进行调用: ////// C++ // student 结构体定义 typedef struct { int age; char name[20]; }Student; //  ...

  7. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  8. jna 使用实例,

    有与项目组需要用到C++的一个模块, 需要将一个2维数组传到dll 里面 ,返回一个字符串, 恶心了1天终于完成了, 记录一下,同时也希望能给你带来帮助. java 代码如下, package tes ...

  9. JNA—JNI终结者

    JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...

  10. JNA入门实例

    JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...

随机推荐

  1. linux 下 命令行中运行 selenium chrome 问题

    1.chrome 现在不允许使用root运行了. 2.无界面 chromedriver 调用chrome 会出错. <另外一定要匹配 chromedriver和chrome 的版本. 要不会出各 ...

  2. 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击

    20145236<网络对抗>进阶实验--64位Ubuntu 17.10.1 ROP攻击 基础知识 ROP攻击 ROP全称为Retrun-oriented Programmming(面向返回 ...

  3. 【Topcoder 8572】TheLuckySum

    题意:给一个数\(n\),要把它分成lucky numbers的和. 问个数最少.字典序最小的方案. 思路:果断搜索.个数最少,所以迭代加深.枚举要的个数\(m\). 首先我们看\(n\)的个位.它肯 ...

  4. Golang 入门系列(六)理解Go中的协程(Goroutine)

    前面讲的都是一些Go 语言的基础知识,感兴趣的朋友可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category/1275863.html. 今天就 ...

  5. CCPC-Wannafly Winter Camp Day1部分题目解析

    Preface 最近恰好不知道做什么题,所以就按老叶要求做上面的比赛. 稍微看了下感觉难度适中,大部分题目偏向联赛难度,当然也有些题目打到了省选题的感觉(基本都是Div1的题) 这里就简单拿一些我做得 ...

  6. C# 远程获取图片二进制

    直接上代码, 紧做记录. public byte[] GetByteByImgUrl() { System.Net.WebRequest webreq = System.Net.WebRequest. ...

  7. Kubernetes — 控制器

    Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已. 说得更形象些,“容器”镜像虽然好用,但是容器这样一个“沙盒”的概念,对于描述应用来说, 还是太过简单了. 这就好比,集装 ...

  8. Laravel 框架结构 以及目录文件解读(学习笔记)

    composer下载Laravel 5.4(由于PHP版本仅7.0,故未下载5.6) composer create-project laravel/laravel your-project-name ...

  9. P2822 组合数问题 HMR大佬讲解

    今天HMR大佬给我们讲解了这一道难题. 基本思路是: 可以将问题转化为:求出杨辉三角,用二维数组f[i][j]来表示在杨辉三角中以第i行第j列的点为右下角,第0行第0列处的点为左上角的矩阵中所有元素是 ...

  10. JPA的merge对联合唯一索引无效(代码库)

    问题 JPA的merge()操作 是合并的意思,就是当保存的实体时,根据主键id划分,如果已存在,那么就是更新操作,如果不存在,就是新增操作 但是这个仅针对 主键id 划分,对联合唯一索引 无效,两次 ...