`
rensanning
  • 浏览: 3553393 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38236
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607654
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682846
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89577
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402165
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69772
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91866
社区版块
存档分类
最新评论

Java调用Native API之JNA

    博客分类:
  • Java
 
阅读更多
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

    本文将详细介绍如何使用Java通过JNA调用系统API,以Windows系统为例,重点讲解如何调用`Kernel32.dll`中的`GetLocalTime()`, `GetSystemTime()` 和 `SetLocalTime()` 方法。 1. **Java Native Access (JNA)**: JNA...

    JNA Java Native Access

    Java Native Access(JNA)是Java平台上的一个开源框架,它允许Java代码直接调用操作系统原生函数,而无需编写传统的Java本地接口(JNI)代码。JNA提供了一种更简单、更直观的方式来与C库和其他本地代码进行交互,极...

    jna 现成的java调用jna项目 包括jna.jar

    在标题和描述中提到的"jna 现成的java调用jna项目 包括jna.jar",意味着这是一个包含JNA库的项目,其中的`jna.jar`文件是JNA的核心组件。 **JNA的工作原理:** JNA通过动态加载本地库并在Java中定义相应的接口来...

    java调用windows api

    Java调用Windows API是将Java程序与Windows操作系统底层功能相结合的一种技术。这允许Java开发者利用Java的跨平台特性,同时可以访问到特定于Windows系统的功能,例如注册表操作、文件系统监控、用户权限管理等。要...

    java调用dll需要的jna包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要依赖于Java Native Access (JNA) 库。JNA提供了一种无需编写本地代码(如C/C++)即可与本地平台API进行交互的方式,包括Windows上的DLL、Unix上的共享库...

    Java Native Access JNA-4.5.0

    Java Native Access (JNA) 是一个Java平台的开源库,它允许Java程序无需编写C语言的JNI(Java Native Interface)代码就能直接调用本机库函数。JNA 提供了一种简单的方式来映射Java方法到本地函数,使得开发者能够...

    JNA调用DLL完整实例demo

    Java Native Access (JNA) 是一个流行的Java库,它允许开发者无需编写JNI代码就能直接调用原生平台API。本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA...

    JNA的API文档

    JNA的API文档是理解和使用JNA的关键资源,它详细解释了各种类、接口和方法,帮助开发者在Java应用中实现对操作系统功能的调用。 在JNA API文档中,主要包含以下几个关键部分: 1. **com.sun.jna** 包:这是JNA的...

    JNA_API.zip_JNA API_jna_jna api_jna 帮助文档_speciesmux

    Java Native Access (JNA) 是一个Java库,它允许Java代码直接调用操作系统提供的原生函数,无需编写C语言的头文件和动态链接库。JNA 提供了一种相对简单的方法来访问操作系统的服务,从而避免了使用Java Native ...

    java jna 调用pytorch c++模型推理

    JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如C++编写的库),而无需编写JNI(Java Native Interface)代码。这种方式可以方便地将高性能的C++库集成到Java应用程序中。 在...

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

    本项目提供了一个完整的Java调用JNA的示例工程,其中包含了必要的`jna.jar`库文件,为开发者提供了便捷的参考。 在Java中,与本地系统进行交互通常需要借助Java Native Interface (JNI)。然而,JNI需要编写大量的C/...

    JNA例子包含jna.jar已经java调用JNA的例子

    Java Native Access(JNA...在这个压缩包中提供的例子,就是一个典型的JNA应用,演示了如何通过Java调用`msvcrt`库中的`printf`函数。对于任何需要与本地系统功能进行交互的Java项目,JNA都是一个值得考虑的解决方案。

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    首先,我们来看标题中的关键点:“JAVA调用第三方DLL的简单方法”。在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL...

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

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    jna-5.6.0.jar、jna-platform-5.6.0.jar

    JNA是一种开源Java库,它允许Java代码直接调用系统级别的函数,包括操作系统API和本地库,而无需编写C代码或使用JNI(Java Native Interface)。JNA通过一个动态代理机制,将Java方法映射到本地函数,极大地简化了...

    jna-platform-4.3.0-API文档-中文版.rar

    Java Native Access (JNA) 是一个Java库,允许Java程序与本地平台API进行交互,而无需编写JNI(Java Native Interface)代码。JNA Platform是JNA的一个扩展,提供了对特定操作系统功能的访问,特别是针对Windows、...

    JNA-3.5.1 Java Native Access

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的动态链接库(DLL)或使用Java的Java Native Interface (JNI)。JNA提供了更为简洁和方便的...

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

    - **使用Native Interface**:实例化接口的`com.sun.jna.Library`实现,JNA会自动加载对应的动态库并调用其中的方法。 3. **处理.dll和.so文件**: - **Windows (.dll)**:在Windows系统中,.dll文件是动态链接库...

    C++头文件转JAVA JNA接口类

    为了实现这种通信,我们可以使用Java Native Access(JNA),它是一种无需编写原生代码就能直接调用操作系统API或其他本地库的Java库。本篇文章将详细介绍如何将C++的头文件转换为Java的JNA接口类,以便于Java程序...

Global site tag (gtag.js) - Google Analytics