`

Linux下java调用本地化程序(C/C++)——JNA

 
阅读更多
    通常java自带的调用本地化程序(C/C++)是通过JNI的方式,但是此种方式操作非常不便,为此SUN又开发了另外一套调用本地化程序的方式——JNA(Java Native Access),底层的实现方式是JNI,只是在上层做了一次封装。

    目前GNA新的访问入口github上,请猛戳这里https://github.com/twall/jna

    功能简单易用,很强大
    不堪回首的JNI我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。
如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的  dll/so中公布的函数。

然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。

经过2个繁琐的步骤才能在Java中调用本地代码。
因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!

废话少说,接下直接有图有码有真相的告知大家如何方便易用JNA

首先在linux eclipse中建立一个C语言动态链接库(Shared Library)hello工程,如下图所示:

hello工程里面只有一个源文件helloworld.c其内的代码如下:

/*
 * helloworld.c
 *
 *  Created on: Nov 29, 2013
 *      Author: semantic
 */

#include <stdio.h>

void test(){
	printf("Hello World!\n");
}


通过自动编译生成libhello.so动态库文件

接下来创建java调用动态库工程hello4j,如下图所示:


hello4j只有一个源文件Hello.java,内容如下:
import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * @author semantic
 * 
 */
public class Hello {

	// 继承Library,用于加载库文件
	public interface Clibrary extends Library {
		// 加载libhello.so链接库
		Clibrary INSTANTCE = (Clibrary) Native.loadLibrary("hello",
				Clibrary.class);

		// 此方法为链接库中的方法
		void test();
	}

	public static void main(String[] args) {
		// 调用
		Clibrary.INSTANTCE.test();
	}

}


记得hello4j工程要依赖jna.jar

运行Hello.java程序,发现会报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'hello': libhello.so: cannot open shared object file: No such file or directory
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:145)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:188)
at com.sun.jna.Library$Handler.<init>(Library.java:123)
at com.sun.jna.Native.loadLibrary(Native.java:255)
at com.sun.jna.Native.loadLibrary(Native.java:241)
at Hello$Clibrary.<clinit>(Hello.java:13)
at Hello.main(Hello.java:22)



那是因为系统找不到libhello.so库文件,当前的解决方案是将libhello.so文件放在/usr/lib
再次运行,即可达到预期的结果:
Hello World!
  • 大小: 32.4 KB
  • 大小: 45.8 KB
分享到:
评论

相关推荐

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    Java Native Access (JNA) 是一个非常实用的框架,它允许Java程序直接调用本地(Native)代码,无需编写JNI(Java Native Interface)代码。本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和...

    jna java 调用c动态库

    虽然JNA简化了Java调用本地代码的过程,但它并不总是最快的解决方案。对于性能敏感的应用,JNI可能仍然是更好的选择,因为它允许更底层的优化。然而,对于大多数应用来说,JNA的便利性和易用性使其成为首选的Java...

    java调用本地化(dll)实用文档

    - **JNA**:简化了这一过程,用户无需编写任何C/C++代码,仅通过Java代码即可实现调用本地库的功能,大大提高了开发效率。 ##### 3. JNA快速入门 - **步骤**: 1. **下载JAR包**:首先需要下载`jna.jar`,可以从...

    jna_jni之java调用C

    总结来说,JNA和JNI都是Java调用本地代码的手段,JNA以其简洁易用的特点成为许多开发者首选。在处理简单的本地调用时,JNA通常是更好的选择,因为它避免了JNI的繁琐步骤。然而,对于需要高性能或者复杂的本地接口...

    Java通过JNA调用系统API

    JNA 是一个开源库,它允许Java程序直接调用本地库函数,无需编写JNI(Java Native Interface)代码。JNA通过映射Java接口到本地库函数来实现这一功能,简化了Java与本地代码的交互。 2. **调用系统API**: 在...

    jni调用C++动态库,jna调用C++动态库

    在Java世界中,有时我们需要利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用C++编写的动态链接库(DLL或SO文件),以实现Java程序与底层系统的交互。这两者都是Java平台上的关键组件,...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    虽然JNA极大地简化了Java与C/C++之间的调用过程,但仍存在一些技术难点: - **跨平台兼容性**:虽然JNA努力支持跨平台调用,但在某些特定平台上仍可能出现兼容性问题。 - **性能问题**:相比于直接使用JNI,JNA由于...

    java用JNA调用dll实例,包含各种参数调用

    Java Native Access(JNA)是Java平台上的一个开源库,它提供了直接调用系统DLL函数的能力,无需编写C代码或者使用JNI(Java Native Interface)。本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括...

    jna java调用工程包括jna.jar文件

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数来实现这一功能,极大地简化了Java与本地库的交互...

    C++转Java工具

    JNI是Java平台提供的一种接口,它允许Java代码调用本地(非Java)代码,如C++或C,反之亦然。这在处理性能敏感的部分,如图形处理、硬件访问或已有的C/C++库时非常有用。在JNI开发中,通常会编写Java代码来定义本地...

    JNA调用.dll文件或.so动态链接库的代码demo

    总的来说,JNA为Java开发者提供了一种便捷的方式来调用本地系统功能,而无需深入学习底层的C/C++编程。通过理解JNA的工作原理和使用技巧,开发者可以充分利用Java的跨平台特性,同时享受到本地API的强大功能。

    Java高手调用windows本地API、或者是c、c++等语言写的动态链接库源代码

    首先,Java本身并不直接支持调用本地API或DLL,但可以通过Java Native Interface (JNI) 或者 Java Native Access (JNA) 这两种技术来实现。JNI 是Java平台的标准接口,允许Java代码和其他语言写的代码进行交互,而...

    嵌入式开发学习笔记( java - c/c++ :从入门到入门 )

    3. JNA(Java Native Access):JNA是一个Java库,它提供了一种简易的方法,使得Java程序能够调用动态链接库(DLL或SO)中的函数,而无需编写JNI的本地方法接口。 4. DLL(Dynamic Link Library)和SO(Shared ...

    jna.rar_jna_jna.jar_jna文件

    例如,如果你需要调用Windows API中的某个函数,你可以创建一个接口,然后通过JNA的Platform类加载相应的库,并实例化该接口,就可以直接调用本地函数了。 使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...

    JNA 转java接口以及指针结构体解析

    Java Native Access(JNA)是Java平台上的一个库,它允许Java代码直接调用本地(操作系统级别的)函数,而无需编写任何JNI(Java Native Interface)代码。JNA通过提供一个映射机制,将Java方法与C/C++函数相对应,...

    java调用动态库实例

    JNI需要编写C/C++代码来创建一个桥接,使得Java能够调用本地函数。相比于JNA,JNI提供了更底层的控制,但编写和调试的过程更为复杂。JNative提供了一些工具和封装,使得使用JNI编写本地方法变得更加方便。 4. 使用...

    利用jna在java下调用c语言库文件

    总的来说,Java JNA提供了一种方便、高效的方式,让Java程序能够无缝地调用C/C++库,极大地扩展了Java的功能边界。通过理解和实践这个例子,你可以掌握在Java中调用本地库的基本技能,并将其应用于各种实际项目中。

    java页面调用C控件

    标题“Java页面调用C控件”涉及到的技术领域是跨平台通信和软件集成,主要讨论的是如何在Java应用程序中调用由C语言编写的控件或动态链接库(DLL)。这种技术常见于需要利用特定硬件功能或者已有的C/C++库资源的场景...

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件和JNI(Java Native Interface)代码的需要。JNA提供了一种相对简单的方法来映射Java方法到本地函数调用,使得Java开发者能够轻松地访问操作系统的服务...

Global site tag (gtag.js) - Google Analytics