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

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

因此,很少有Java程序员愿意编写调用dll/.so库中原生函数的java程序。这也使Java语言在客户端上乏善可陈,可以说JNI是 Java的一大弱点! 那么JNA是什么呢?...注意: JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。...当然要从最经典的HelloWorld开始,我们调用C的printf函数打印出“HelloWorld”(官方的例子),前提是已将jar加入你的classpath。...另外,JNA还支持类型映射定制,比如有的Java中可能找不到对应的类型(在Windows API中可能会有很多类型,在Java中找不到其对应的类型),JNA中TypeMapper类和相关的接口就提供了这样的功能...使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。 而JNA只能实现Java访问C函数,作为一个Java框架,自然不能实现C语言调用Java代码。

4.4K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java高级用法之:JNA中的Structure

    简介 前面我们讲到了JNAJAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native...不用怕,JNA提供了Structure类,来帮助我们进行这些映射处理。 native中的struct 什么时候会用到struct呢?...结构体中的只读字段 如果不想从JAVA代码中对Structure的内容进行修改,则可以将对应的字段标记为final。...来看下JAVA中如何使用final字段: class ReadOnly extends com.sun.jna.Structure { public final int refCount; {...总结 结构体是native方法中经常会使用到的一种数据类型,JNA中对其进行映射的方法是我们要掌握的。 本文已收录于 http://www.flydean.com/08-jna-structure/

    62820

    java高级用法之:JNA中的回调

    为了方便和native方法进行交互,JNA中同样提供了Callback用来进行回调。JNA中回调的本质是一个指向native函数的指针,通过这个指针可以调用native函数中的方法,一起来看看吧。...JNA中的Callback 先看下JNA中Callback的定义: public interface Callback { interface UncaughtExceptionHandler...这个interface主要用于处理JAVA的callback代码中没有捕获的异常。 注意,在uncaughtException方法中,不能抛出异常,任何从这个方法抛出的异常都会被忽略。...Callback还有一个同胞兄弟叫做DLLCallback,我们来看下DLLCallback的定义: public interface DLLCallback extends Callback { @java.lang.annotation.Native...本文的代码:https://github.com/ddean2009/learn-java-base-9-to-20.git 本文已收录于 http://www.flydean.com/09-jna-callbacks

    1.4K10

    java高级用法之:在JNA中使用类型映射

    简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比较简单,我们在之前的文章中已经讲解过了,对于类型映射来说,因为JAVA中的类型种类比较多...,所以这里我们将JNA的类型映射提取出来单独讲解。...类型映射的本质 我们之前提到在JNA中有两种方法来映射JAVA中的方法和native libary中的方法,一种方法叫做interface mapping,一种方式叫做direct mapping。...除了JAVA自带的类型映射,JNA内部也定义了一些数据类型,可以跟native的类型进行映射: C Type Native类型的含义 Java Type long 和平台相关(32- or 64-bit...总结 本文讲解了JNA中的类型映射规则和自定义类型映射的方法。 本文的代码:https://github.com/ddean2009/learn-java-base-9-to-20.git

    1.4K30

    java高级用法之:JNA中的回调

    为了方便和native方法进行交互,JNA中同样提供了Callback用来进行回调。JNA中回调的本质是一个指向native函数的指针,通过这个指针可以调用native函数中的方法,一起来看看吧。...JNA中的Callback 先看下JNA中Callback的定义: public interface Callback { interface UncaughtExceptionHandler...这个interface主要用于处理JAVA的callback代码中没有捕获的异常。 注意,在uncaughtException方法中,不能抛出异常,任何从这个方法抛出的异常都会被忽略。...Callback还有一个同胞兄弟叫做DLLCallback,我们来看下DLLCallback的定义: public interface DLLCallback extends Callback { @java.lang.annotation.Native...本文的代码:https://github.com/ddean2009/learn-java-base-9-to-20.git 本文已收录于 http://www.flydean.com/09-jna-callbacks

    87730

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

    简介 JNA提供JAVA类型和native类型的映射关系,但是这一种映射关系只是一个大概的映射,我们在实际的应用中还有很多需要注意的事项,本文将会为大家详细讲解在使用类型映射中可能会出现的问题。...如果JAVA的unicode characters要转换成为char数组,那么需要进行一些编码操作,如果设置了jna.encoding,那么就会使用设置好的编码方式来进行编码。...Mapping A String getString(); // Mapping B WString getString(); 如果native code为String分配了内存空间,那么我们最好使用JNA...added correctly", arg1 + arg2, lib.addVarArgs("dd", arg1, arg2)); 总结 本文介绍了在使用JNA...本文的代码:https://github.com/ddean2009/learn-java-base-9-to-20.git 本文已收录于 http://www.flydean.com/05-jna-type-mapping-details-md

    1.3K50

    java高级用法之:在JNA中将本地方法映射到JAVA代码中

    简介 不管是JNI还是JNA,最终调用的都是native的方法,但是对于JAVA程序来说,一定需要一个调用native方法的入口,也就是说我们需要在JAVA方法中定义需要调用的native方法。...那么在JNA中有那些在JAVA代码中定义本地方法的方式呢? Library Mapping 要想调用本地的native方法,首选需要做的事情就是加载native的lib文件。...JNA中有两种Library 映射的方法,分别是interface和direct mapping。...性能考虑 上面我们提到了JNA的两种mapping方式,分别是interface mapping和direct mapping。...总结 JNA是调用native方法的利器,如果数量掌握的话,肯定是如虎添翼。 本文已收录于 http://www.flydean.com/03-jna-library-mapping/

    1.1K20

    java高级用法之:在JNA中将本地方法映射到JAVA代码中

    简介 不管是JNI还是JNA,最终调用的都是native的方法,但是对于JAVA程序来说,一定需要一个调用native方法的入口,也就是说我们需要在JAVA方法中定义需要调用的native方法。...那么在JNA中有那些在JAVA代码中定义本地方法的方式呢? Library Mapping 要想调用本地的native方法,首选需要做的事情就是加载native的lib文件。...JNA中有两种Library 映射的方法,分别是interface和direct mapping。...性能考虑 上面我们提到了JNA的两种mapping方式,分别是interface mapping和direct mapping。...总结 JNA是调用native方法的利器,如果数量掌握的话,肯定是如虎添翼。 本文已收录于 http://www.flydean.com/03-jna-library-mapping/

    1.1K40

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

    JNI技术,用JNI写java调用接口代码是非常痛苦的,调试也是比较麻烦的事儿,JNA推出后,大大降低了开发难度,java程序员只要为对应的动态库定义java native方法代码,为对应的C数据结构写出...相比JNI,JNA是一个很大的进步,但java程序还是要写一些java代码才能正确调用动态库,动态库函数涉及的所有结构类型都需要定义对应的java类型,如果结构类型比较多是个很大的工作量。...最近正为写调用动态库的事儿头痛,虽然我也会写JNI代码,但实在太麻烦,总想找个捷径,看了JNA相关资料后,发现用JNA所需要写的相关java代码其实都是很有规则的。...-jar指定生成的jar文件名 StandaloneJar : 生成包含所有依赖库的jar ,可以使用-jar指定生成的jar文件名 Directory : 生成代码到文件夹 Maven : 生成...jna_code -package net.gdface.jna 指定生成java代码的名。

    4.3K10

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

    但有的时候,我们希望java层与动态库直接传递Java对象,动态库以JNI方式访问java层传递的Java对象,或直接返回java对象给java层,JNA可以实现么?...最近我就遇到了这个问题,研究了JNA的代码后,发现JNA框架默认是不是允许直接传递java对象的。但可以通过指定特定的选项实现java对象的传递。...这些特别要求中就有一个我们本次任务中要用到的选项: com.sun.jna.Library.OPTION_ALLOW_OBJECTS 该选项是个布尔值,为true时允许任何Java对象作为输入参数或返回值...因为我们无法将一个Object转为Pointer对象 正确的做法如下: /** * JNA传递Java对象测试 */ @Test public void testObjectArg(){...com.sun.jna.JNIEnv.CURRENT 对象代替实际的动态库访问java对象所需要的JNIEnv结构 Class<?

    1.2K20

    Java

    Java概念Java中的(Package)是一种用来管理类和接口的机制。它可以将相关的类和接口放在同一个命名空间下,以避免类名和接口名的冲突,并提供更好的可重用性和可维护性。...Java的作用Java的作用在于:把功能相似或相关的类或接口组织在同一个中,方便类的查找和使用。采用树形目录的存储方式,使得之间产生了关系,方便维护、管理。...Java的定义在Java中,我们可以通过在Java源文件的第一行使用 package 语句来定义一个。...在Java源文件的第一行使用 import 语句可以导入其他中的类。...Java的命名规范Java的命名规范通常是按照公司或者组织的域名来定义的,例如:com.example.myPackage。这种做法可以有效地避免不同公司或组织之间的名冲突。

    16021
    领券