java library jna_Java调用Native API之JNA

本文介绍了如何使用Java Native Access (JNA) 库在Java中调用Native API,包括静态和动态映射方法。通过示例展示了如何调用Windows API的printf函数以及直接调用本地C库的方法。
摘要由CSDN通过智能技术生成

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

/* 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

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

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2014-11-10 12:09

浏览 6866

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值