Hello jna
记录下这几天用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的更多相关文章
- JNA 如何 加载多个 存在依赖的 DLL 库
JNA 的出现,极大的简化了原有的 JNI 技术.下面是JNA github地址:https://github.com/java-native-access/jna 1. 简单的一个例子: /** S ...
- 使用jna调用dll,jdk位数和dll位数的关系
最近在学习jna,发现dll文件能能否成功调用取决于jdk位数. 32位jdk只能使用32位的dll,64位jdk只能使用64位的dll,否则位数不对应的话报的错是 "Exception i ...
- JNA开发中的问题积累
[Qboy原创] 2013年12月28日 在开发一个项目过程中需要调用第三方的C的dll.由于是第一次在项目中使用JNA,很多都安装开发文档来做,但是出现了很多的问题. 由于很多接口还没调完,还不知道 ...
- JNA使用
JNA与C对应的数据类型: 注意: 使用byte[]对应C++中的char* 可以返回函数执行的结果值 一.添加JNA需要的jar包 1.jna.jar 2.plat ...
- JNA参数传递问题,Java数组
版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法. C语言结构体定义如下: typedef struct Rect { in ...
- JNA结构体参数传递,Java数组
JNA以结构体数组为参数进行调用: ////// C++ // student 结构体定义 typedef struct { int age; char name[20]; }Student; // ...
- java 用JNA方法调用C++动态链接库
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...
- jna 使用实例,
有与项目组需要用到C++的一个模块, 需要将一个2维数组传到dll 里面 ,返回一个字符串, 恶心了1天终于完成了, 记录一下,同时也希望能给你带来帮助. java 代码如下, package tes ...
- JNA—JNI终结者
JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...
- JNA入门实例
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...
随机推荐
- Docker(3):Dockerfile配置详解
FROM : 指定base镜像 MAINTAINER :设置镜像的作者,可以是任意的字符串 COPY :将文件从build context 复制到镜像 COPY 支持两种形式:COPY src ...
- 【P2015】二叉苹果树 (树形DP分组背包)
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是 ...
- linux安装OpenCV以及windows安装numpy、cv2等python2.7模块
OpenCV(Open Source Computer Vision Library) 是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它具有C ++,C,Python和Java接口,可以运行在 ...
- windows下redis安装及配置
1.简介: redis是一个高性能的key-value数据库:redis能读的速度为11万次/秒,写的速度是8.1万次/秒 redis支持丰富的数据类型:String, List, Hash(map) ...
- JS 设计模式二 -- 单例模式
单例模式 概念 单例模式 就是保证一个类只有一个实例,并提供一个访问它的全局访问点. 实现方法 先判断实例是否存在,如果存在直接返回,如果不存在就创建实例后在返回,确保了一个类只有一个实例对象. va ...
- Windows 2016 忘记密码的处理方法
发现使用 osk 还有 magnify 的方式修改 密码的方式在win server 的机器上面行不通了. 换一种方式进行处理. 使用PE 方式处理. 1. 下载PE 发现比较早的PE 也搞不定 可能 ...
- javascript高级排序算法之快速排序(快排)
javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...
- SpringBoot项目优化和Jvm调优(转)
原文:https://blog.csdn.net/wd2014610/article/details/82182617 项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringB ...
- Python——Pycharm基本设置
一.,模板(加入中文UTF-8) #!/usr/bin/env python # -*- coding:utf-8 -*- 设置方法:file->settings->Editor-> ...
- Python——Flash框架——用户认证
一.认证扩展 1.Flask-Login:管理已登录用户的用户会话 2.Werkzeug:计算几码散列值并进行核对 3.itsdangerous:生成并核对加密安全令牌 二.Werkzeug gene ...