Java调用C/C++的Native API一般采用JNI(Java Native Interface),但是需要编写特殊的代码,方法、数据的映射也很复杂。JNA(Java Native Access)能够是Java代码很简单的调用到Native API(.dll、.so)。类似于.NET的P/Invoke(Platform Invoke)、Python的ctypes。最初是1999年SUN公司为开发NetBeans IDE而开发的,2006年开源。
https://github.com/twall/jna
目前版本: 4.1.0
先看一个简单的例子:调用Windows API的printf输出“Hello, World”。
JNA代码:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class HelloWorld1 {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
Platform.isWindows() ? "msvcrt" : "c", CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
}
}
第6行定义CLibrary映射到Native(继承JNA的Library)
第7,8行加载目标Native Lib(Windows:msvcrt.dll,也可以是自己的so或dll)
第10行映射Native方法
第14行作为Java的普通方法调用printf
这是一种静态的映射方法,以下也可以动态映射:
import com.sun.jna.Function;
import com.sun.jna.Platform;
public class HelloWorld2 {
public static void main(String[] args) {
String libraryName = Platform.isWindows() ? "msvcrt" : "c";
String functionName = "printf";
// Function
Function function = Function.getFunction(
libraryName,
functionName,
Function.C_CONVENTION);
// Invoke
function.invoke(new Object[]{"Hello, world\n"});
}
}
JNI来实现调用C写的方法:
1)编写HelloWorld.java
/* HelloWorld.java */
public class HelloWorld {
public native void hello(); /* (1) */
static {
System.loadLibrary("helloworld"); /* (2) */
}
public static void main (String args[]) {
HelloWorld h = new HelloWorld();
h.hello(); /* (3) */
}
}
2)编译java文件
引用
/usr/java/jdk1.7.0_45/bin/javac HelloWorld.java
3)生成JNI的HelloWorld.h
引用
/usr/java/jdk1.7.0_45/bin/javah -jni HelloWorld
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4)编写HelloWorld.c
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *env, jobject me)
{
printf("Hello World\n");
}
5)编译HelloWorld.c
引用
gcc -fPIC -shared HelloWorld.c -I/usr/java/jdk1.7.0_45/include/ -I/usr/java/jdk1.7.0_45/include/linux/ -o libhelloworld.so
6)执行HelloWorld
引用
java -Djava.library.path=. HelloWorld
JNA来实现调用C写的方法:
1)编写hello.c
#include <stdio.h>
void hello ()
{
printf("Hello World!\n");
}
2)编译hello.c
引用
gcc -fPIC -shared -o libhello.so hello.c
3)编写HelloJNA.java
import com.sun.jna.Library;
import com.sun.jna.Native;
interface HelloLib extends Library {
HelloLib INSTANCE = (HelloLib) Native.loadLibrary("hello", HelloLib.class);
void hello();
}
public class HelloJNA {
public static void main(String[] args){
HelloLib hello = HelloLib.INSTANCE;
hello.hello();
}
}
4)编译执行
引用
javac -cp jna-4.1.0.jar HelloJNA.java
java -cp .:jna-4.1.0.jar HelloJNA
参考:
http://en.wikipedia.org/wiki/Java_Native_Access
http://en.wikipedia.org/wiki/Java_Native_Interface
http://en.wikipedia.org/wiki/SWIG
http://www.swig.org/
http://en.wikipedia.org/wiki/Platform_Invocation_Services
http://www.atmarkit.co.jp/fjava/special/jna/jna_1.html
分享到:
相关推荐
本文将详细介绍如何使用Java通过JNA调用系统API,以Windows系统为例,重点讲解如何调用`Kernel32.dll`中的`GetLocalTime()`, `GetSystemTime()` 和 `SetLocalTime()` 方法。 1. **Java Native Access (JNA)**: JNA...
Java Native Access(JNA)是Java平台上的一个开源框架,它允许Java代码直接调用操作系统原生函数,而无需编写传统的Java本地接口(JNI)代码。JNA提供了一种更简单、更直观的方式来与C库和其他本地代码进行交互,极...
在标题和描述中提到的"jna 现成的java调用jna项目 包括jna.jar",意味着这是一个包含JNA库的项目,其中的`jna.jar`文件是JNA的核心组件。 **JNA的工作原理:** JNA通过动态加载本地库并在Java中定义相应的接口来...
Java调用Windows API是将Java程序与Windows操作系统底层功能相结合的一种技术。这允许Java开发者利用Java的跨平台特性,同时可以访问到特定于Windows系统的功能,例如注册表操作、文件系统监控、用户权限管理等。要...
Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要依赖于Java Native Access (JNA) 库。JNA提供了一种无需编写本地代码(如C/C++)即可与本地平台API进行交互的方式,包括Windows上的DLL、Unix上的共享库...
Java Native Access (JNA) 是一个Java平台的开源库,它允许Java程序无需编写C语言的JNI(Java Native Interface)代码就能直接调用本机库函数。JNA 提供了一种简单的方式来映射Java方法到本地函数,使得开发者能够...
Java Native Access (JNA) 是一个流行的Java库,它允许开发者无需编写JNI代码就能直接调用原生平台API。本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA...
JNA的API文档是理解和使用JNA的关键资源,它详细解释了各种类、接口和方法,帮助开发者在Java应用中实现对操作系统功能的调用。 在JNA API文档中,主要包含以下几个关键部分: 1. **com.sun.jna** 包:这是JNA的...
Java Native Access (JNA) 是一个Java库,它允许Java代码直接调用操作系统提供的原生函数,无需编写C语言的头文件和动态链接库。JNA 提供了一种相对简单的方法来访问操作系统的服务,从而避免了使用Java Native ...
JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如C++编写的库),而无需编写JNI(Java Native Interface)代码。这种方式可以方便地将高性能的C++库集成到Java应用程序中。 在...
本项目提供了一个完整的Java调用JNA的示例工程,其中包含了必要的`jna.jar`库文件,为开发者提供了便捷的参考。 在Java中,与本地系统进行交互通常需要借助Java Native Interface (JNI)。然而,JNI需要编写大量的C/...
Java Native Access(JNA...在这个压缩包中提供的例子,就是一个典型的JNA应用,演示了如何通过Java调用`msvcrt`库中的`printf`函数。对于任何需要与本地系统功能进行交互的Java项目,JNA都是一个值得考虑的解决方案。
首先,我们来看标题中的关键点:“JAVA调用第三方DLL的简单方法”。在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL...
为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...
JNA是一种开源Java库,它允许Java代码直接调用系统级别的函数,包括操作系统API和本地库,而无需编写C代码或使用JNI(Java Native Interface)。JNA通过一个动态代理机制,将Java方法映射到本地函数,极大地简化了...
Java Native Access (JNA) 是一个Java库,允许Java程序与本地平台API进行交互,而无需编写JNI(Java Native Interface)代码。JNA Platform是JNA的一个扩展,提供了对特定操作系统功能的访问,特别是针对Windows、...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的动态链接库(DLL)或使用Java的Java Native Interface (JNI)。JNA提供了更为简洁和方便的...
- **使用Native Interface**:实例化接口的`com.sun.jna.Library`实现,JNA会自动加载对应的动态库并调用其中的方法。 3. **处理.dll和.so文件**: - **Windows (.dll)**:在Windows系统中,.dll文件是动态链接库...
为了实现这种通信,我们可以使用Java Native Access(JNA),它是一种无需编写原生代码就能直接调用操作系统API或其他本地库的Java库。本篇文章将详细介绍如何将C++的头文件转换为Java的JNA接口类,以便于Java程序...