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 ...
随机推荐
- Android图片选择---MultiImageSelector的使用
Github地址:https://github.com/lovetuzitong/MultiImageSelector MultiImageSelector主要是图片选择功能. AndroidStud ...
- MYSQL primary key use btree 是什么含义了解一下
CREATE TABLE `sth_definition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `analyseId` bigint(20) DEFAULT ...
- (十二)Deleting Documents
Deleting a document is fairly straightforward. This example shows how to delete our previous custome ...
- c# throw和throw ex
c# throw和throw ex 我们在日常开发当中,经常会用到exception异常,并且我们会在exception中的catch块中throw exception,例如: static void ...
- Bootstrap开发框架视频整理
最近到客户处进行实地培训,整理了很多培训的材料,现将它们录制相关主题的视频,作为我的Bootstrap开发框架的知识补充,希望给感兴趣的朋友进行了解.培训内容主要包括基础框架部分.MVC框架部分.Bo ...
- HDU-1695 莫比乌斯反演
这里学习一下莫比乌斯反演 翻看了很多书,发现莫比乌斯反演,准确来说不是一种固有的公式,而是一种法则. 我们定义F(n),为f(d)的和函数,而定义f(n)为某儿算术函数. 反演公式1:反演n的因子时 ...
- OpenStack-Glance(3)
一. Glance功能 传统 IT 环境下,安装一个系统是要么从CD安装,要么用 Ghost 等克隆工具恢复.有如下几个问题: 如果要安装的系统多了效率就很低 时间长,工作量大 安装完还要进行手工配置 ...
- Django之ORM
- thymeleaf循环
th:each属性用于迭代循环,语法:th:each="obj,iterStat:${objList}"迭代对象可以是Java.util.List,java.util.Map,数组 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...