首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

jnaerator:JNA框架下向动态库传递Java Object(即动态库JNI方式访问java对象)

熟悉JNA童鞋都知道,通过JNA可以向动态库传递(或从动态库返回)com.sun.jna.Structure为基类对象,在动态库一层,会把Structure解析为结构C语言struct或union...但有的时候,我们希望java层与动态库直接传递Java对象,动态库以JNI方式访问java层传递Java对象,或直接返回java对象给java层,JNA可以实现么?...示例 怎么使用OPTION_ALLOW_OBJECTS选项呢? 以下以在我项目中实际应用代码举例说明。...下面是我在动态库中定义一个函数 // @param env JNIEnv 结构,JNI方式访问Java对象必须要有它 // @param arg 输入Java 对象 // @param...com.sun.jna.JNIEnv.CURRENT 对象代替实际动态库访问java对象所需要JNIEnv结构 Class<?

1.1K20

Java调用Golang生成动态库(dll,so)

fr=aladdin,有需要朋友可以去看看。 在这里,我们使用JNA方式,JNI方式基本废弃,除非有特殊需要,在这里不多说,有需要可以联系我讨论。...创建接口 我们需要创建一个interface来映射DLL中函数,之后我们可以通过interface实例来访问DLL中函数。..._ GoString; 嗯嗯嗯,看来这个GoString不过就是个C里面的结构体罢了,结构体里面一个char *一个ptrdiff_t,看来我们用java调用程序时候,构造个这么样结构体给他传进来应该就行了...我们首先用JNA构建一个C结构体类型,那么问题来了,JNAchar *可以直接用javaString来代替,那么ptrdiff_t这个玩意……有点无语,这是啥啊?...无意中看到了当时写借助JNA与C通信,C中将char *返回给Java,然后Java使用String即可接收。嗯,嗯?这条咋忘了呢?

4.8K40
您找到你想要的搜索结果了吗?
是的
没有找到

Java跨语言调用,使用JNA访问Java外部接口

如果已有一个编译好.dll/.so文件,如果使用JNI技 术调用,我们首先需要使用C语言另外写一个.dll/.so共享库,使用SUN规定数据结构替代C语言数据结构,调用已有的 dll/so中公布函...开发者使用Java接口描述目标本地库功能和结构,这使得它很容易利用本机平台功能,而不会产生多平台配置和生成JNI代码高开销。这样性能、准确性和易用性显然受到很大重视。...此外,JNA包括一个已与许多本地函数映射平台库,以及一组简化本地访问公用接口。...注意: JNA是建立在JNI技术基础之上一个Java类库,它使您可以方便地使用java直接访问动态链接库中函数。...使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。 而JNA只能实现Java访问C函数,作为一个Java框架,自然不能实现C语言调用Java代码。

4.1K21

Java调用so文件

---- 一、使用技术 原本是想直接用java自带jni,但是我们硬件只给了一个so文件,而且里面的函数命名等规则不符合javajni调用标准,于是就打算使用框架jna来调用。...从性能上会比JNI技术调用动态链接库要低,但开发人员只要在一个java接口中描述目标native library函数与结构JNA将自动实现Java接口到native function映射,大大降低了...so库中c语言函数2 -> char* Decrpyt( char * input); // ## 备注: 这里char* 是c语言中指针,与java中String相对应 String...需要修改 Clibrary.java 类,因为Linux下使用getResource()方法获取到路径是正确,只有在Windows上调用getResource()方法才会多出一条斜杠,所以在Linux...c语言函数2 -> char* Decrpyt( char * input); // ## 备注: 这里char* 是c语言中指针,与java中String相对应 String Decrpyt

8.3K10

Java 19 已至,虚拟线程 = 王炸!!

语言拥有了类似 C 语言指针一样操作内存空间能力同时,也增加了 Java 语言不安全性,不正确使用 Unsafe 类会使得程序出错概率变大。...引入外部函数和内存 API 就是为了解决 Java 访问外部函数和外部内存存在一些痛点。...Function & Memory API (FFM API) 定义了类和接口: 分配外部内存 :MemorySegment、、MemoryAddress和SegmentAllocator); 操作和访问结构外部内存...下面是 FFM API 使用示例,这段代码获取了 C 库函数 radixsort 方法句柄,然后使用它对 Java 数组中四个字符串进行排序。...这是对数组元素简单标量计算: 这是使用 Vector API 进行等效向量计算: JEP 428: 结构化并发(孵化) JDK 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发

75210

java高级用法之:JNAStructure

我们看下上面的native例子中,如果使用JNAStructure来进行映射应该怎么实现: 指针映射: class Point extends Structure { public int x, y...结构体数组作为参数 首先来看一下结构体数组作为参数情况: void get_devices(struct Device[], int size); 对应结构体数组,可以直接使用JNA中对应Structure...: typedef struct _Buffer { char buf1[32]; char buf2[1024]; } Buffer; 那么我们在JAVA中需要指定数据大小: class Buffer...: typedef struct _Header { int flags; int buf_length; char buffer[1]; } Header; 那么我们需要在JAVA结构体中定义一个构造函数...总结 结构体是native方法中经常会使用一种数据类型,JNA中对其进行映射方法是我们要掌握

1.6K30

java高级用法之:JNAStructure

我们看下上面的native例子中,如果使用JNAStructure来进行映射应该怎么实现: 指针映射: class Point extends Structure { public int x, y...结构体数组作为参数 首先来看一下结构体数组作为参数情况: void get_devices(struct Device[], int size); 对应结构体数组,可以直接使用JNA中对应Structure...: typedef struct _Buffer { char buf1[32]; char buf2[1024]; } Buffer; 那么我们在JAVA中需要指定数据大小: class...: typedef struct _Header { int flags; int buf_length; char buffer[1]; } Header; 那么我们需要在JAVA结构体中定义一个构造函数...总结 结构体是native方法中经常会使用一种数据类型,JNA中对其进行映射方法是我们要掌握。 本文已收录于 http://www.flydean.com/08-jna-structure/

58120

2019-04-08 Swig java Jni开发指南

之所以说它是JNI替 代者,是因为JNA大大简化了调用本地方法过程,使用很方便,基本上不需要脱离Java环境就可以完成。...Swig可以根据c或c++代码生成jni代码工具,大大简化jni开发 Jnaerator可以根据c或c++代码生成jna代码工具,大大简化jna开发 从难易度看,使用jnaerator开发jna...而jna算是中间层,这个层出现错误完全无法调试,被逼无奈,我们项目先用jna开发,不得不转jni开发,在使用swig过程中,也遇到不少问题,因此总结如下: Swig参考文档 http://www.swig.org...使用swig需要生成一个.i接口文件,swig接口文件包含函数原型、类和变量声明,它语法和普通c/c++头文件一样。...,两个处理完全一样,都是把c结构或类包装成java类使用 a) 编写example.h /* File : example.h */ class Shape { public:

54310

Linux下跨语言调用C++实践

2 方案概述 为了达到业务方开箱即用目的,综合考虑C++、Python、Java用户使用习惯,我们设计了如下协作结构: 图 1 3 实现详情 Python、Java支持调用C接口,但不支持调用C...JNA使用方法如下: 在Java项目中引入JNA库。...,比如前面例子中GetStringUTFChars能够将JVM中字符串中文本内容,按照utf8编码格式,拷贝到native heap中,并将char*指针传递给native方法使用。...4.3 扩展阅读(JNA直接映射) 相比于JNI,JNA使用了其函数调用基础框架,其中内存映射部分,由JNA工具库中工具类自动化完成类型映射和内存拷贝大部分工作,从而避免大量胶水代码编写,使用上更为友好...本文例子源代码请访问:GitHub。

5.8K40

2018-12-24 JNA调试 : eclipse + Vs 联合调试

("jna.debug_load", "true"); 或者任何调用jna代码 4、设置断点--c 在vs2015中设置断点到需要调试代码上 5、调试 调试启动java程序,在断点断下来后,切换到...这个错误仅在debug版本dll中存在,更改为release就没有了 7、需要注意地方 char* 数据如果是可以打印,也就是不会中间存在0x00数据,java层就可以直接使用String接收,...但是如果不可打印只能使用Point接收,否则会被0x00位置截断; 如果是java传递byte[]给c,那么使用string和Point都是可以; size_t 数据用long或者NativeSize...都可以接收,建议用NativeSize,如果用int一定得到错误数据; java调用c函数返回值可以是结构体,但是c调用java函数,java函数返回值如果是结构体总是空值,因此只能返回String...,这块比较奇怪,没有搞明白 8、jna代码自动生成 推荐使用jnaerator,下载最新版本,然后命令行执行: java -jar jnaerator-0.12-SNAPSHOT-20130727.jar

81620

Java中一个逐渐被遗忘强大功能,强到你难以置信!!

说起Java,简单好用,但是Java中很多牛逼技术却逐渐被遗忘了~~ 在Java语言出现之前,很多系统都是使用C和C++开发。...JNI这项Java中提供强大功能,却逐渐被人遗忘了。 为何使用JNI?...注意:本文中我使用jna Java类库实现JNI开发。 开发dll动态链接库 下载VS 小伙伴们可以在【冰河技术】公众号回复“vscode”,获取VS2010下载链接。...,double b){ return a*b; } //定义了一个返回java String类型参数 char * getString(char* a){ char* b ="this is test..."; return strcat(a,b); } 这里要注意是:javaString和cppString不一样,其对应char*,如果要用cppstring不是乱码就是调用失败。

42720

java高级用法之:调用本地方法利器JNA

JNA初探 JNA全称是Java Native Access,它为我们提供了一种更加简单方式来访问本地共享库资源,如果你使用JNA,那么你只需要编写相应java代码即可,不需要编写JNI或者本地代码...JNA是一个jar包,它里面除了包含有基本JAVA class文件之外,还有很多和平台相关文件,这些平台相关文件夹下面都是libjnidispatch*库文件。...如果你系统对于从jar文件中解压文件有安全方面的限制,比如SELinux,那么你需要手动将jnidispatch安装在一个可以访问地址,然后使用1或者2方式来设置加载方式和路径。...本地方法中结构体参数 如果本地方法传入参数是基本类型的话,在JNA中定义该native方法就用基本类型即可。 但是有时候,本地方法本身参数是一个结构体类型,这种情况下我们该如何进行处理呢?...基本使用,有关JNA根据深入使用,敬请期待后续文章。

1.4K10

java高级用法之:JNA类型映射应该注意问题

简介 JNA提供JAVA类型和native类型映射关系,但是这一种映射关系只是一个大概映射,我们在实际应用中还有很多需要注意事项,本文将会为大家详细讲解在使用类型映射中可能会出现问题。...如果JAVAunicode characters要转换成为char数组,那么需要进行一些编码操作,如果设置了jna.encoding,那么就会使用设置好编码方式来进行编码。...这是因为getString方法需要对传入char数组中内容进行修改,但是因为String是不可变,所以这里是不能直接使用String,我们需要使用byte数组。...但是如果native方法在方法返回之后,还需要访问数组的话(保存了指向数组指针),这种情况下使用基础类数组就不太合适了,这种情况下,我们需要用到ByteBuffers或者Memory。...JNA方法映射中应该注意一些细节和具体使用问题。

1.2K50

java高级用法之:JNA回调

表示在这个列表里面的名字是不能作为callback方法使用。 目前看来是有三个方法名不能够被使用,分别是:”hashCode”, “equals”, “toString”。...首先看一下在struct中定义函数指针: struct _functions { int (*open)(const char*,int); int (*close)(int); }; 在这个结构体中...如果callback是定义在Structure中,那么可以在Structure进行初始化时候自动实例化,然后只需要从Structure中访问对应属性即可。...大家要注意, 这里有一个关键参数叫做Pointer,实际使用时候,需要传入指向真实naitve函数指针。...在多线程环境中使用callback 默认情况下, callback方法是在当前线程中执行

1.3K10

我敢说:99.9%程序员根本没在项目中使用过Java这个功能!

为何使用JNI 最近,冰河在分析500多TB数据,从500多TB数据中分析用户行为习惯,以便为用户提供更好产品体验和推荐更加适合用户产品。...如何使用JNI 先说说使用JNI时有哪些坑吧,以避免小伙伴们重复踩坑,这里,大家需要注意是:在使用JNI技术调用dll动态链接库时,32位dll只能是32位JDK去调用,64位dll只能是64位JDK...注意:本文中我使用jna Java类库实现JNI开发。...,double b){ return a*b; } //定义了一个返回java String类型参数 char * getString(char* a){ char* b ="this is test..."; return strcat(a,b); } 这里要注意是:javaString和cppString不一样,其对应char,如果要用cppstring不是乱码就是调用失败。

10710

windows下通过Visual Studio编译dlib成dll文件

64位工程,会打出一个64位静态lib包 通过vs编译dlib-19.13成window静态库lib文件 刚刚dlib-19.13\dlib\build目录已经生成/转换为一个vs工程了,直接打开...\xxx.cpp任意一个栗子,我这里是face_landmark_detection_ex.cpp 项目属性页=》VC++目录=》包含目录添加dlib解压路径dlib-19.13 项目属性页=》连接器...release_64bit_msvc1914.lib(不同系统可能名字不一样) 项目属性页=》C/C++=>预处理器添加DLIB_JPEG_SUPPORT和DLIB_JPEG_STATIC 封装自己jna...) >> sp; //加载图片 array2d img; load_image(img, img_file_path); //对图像进行上采用,检测更小的人脸,不使用可以提升速度...//pyramid_up(img); //识别图片中有几张脸 std::vector dets = detector(img); //没有识别到脸或者有多张脸

96320

jnaerator:java调用动态库神器,JNA代码自动生成工具

JNI技术,用JNI写java调用接口代码是非常痛苦,调试也是比较麻烦事儿,JNA推出后,大大降低了开发难度,java程序员只要为对应动态库定义java native方法代码,为对应C数据结构写出...相比JNI,JNA是一个很大进步,但java程序还是要写一些java代码才能正确调用动态库,动态库函数涉及所有结构类型都需要定义对应java类型,如果结构类型比较多是个很大工作量。...代码生成 如下图目录结构,有两个dll,及相对应头文件,我们这两个动态库为例说明如何用jnaerator来生成全套JNA代码。..., -runtime 可选值有(区分大小写): JNA JNAerator (based on JNA) BridJ 支持 C++库 NodeJS 但是实测发现使用BridJ...StandaloneJar : 生成包含所有依赖库jar ,可以使用-jar指定生成jar包文件名 Directory : 生成代码到文件夹 Maven : 生成maven格式项目(pom.xml

4.1K10
领券