JNA的用法
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。
JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。
由于项目中经常要用到java调用so库的情况,这里做一个简单的使用笔记留着回顾。
1、写一个简单的test.c文件:
#include<stdio.h>
int add(int a, int b);
int add(int a, int b)
{
int c = a + b;
printf("Hello, this method is used to add two Integer.");
return c;
}
2、将.c文件编译为so动态链接库
[keysystem@localhost jnaTest]$ gcc -fpic -c test.c
[keysystem@localhost jnaTest]$ gcc -shared -o libtest.so test.o
[keysystem@localhost jnaTest]$ ll -rlt
total
-rw-rw-r--. keysystem keysystem Apr : test.c
-rw-rw-r--. keysystem keysystem Apr : test.jar
-rw-rw-r--. keysystem keysystem Apr : test.o
-rwxrwxr-x. keysystem keysystem Apr : libtest.so
[keysystem@localhost jnaTest]$
这样就会生成so库文件了。这里so库的命名要为libtest.so,而不能是test.so。因为JNA在找so
3、创建java project,编写Test.java
因为是使用JNA,所以要依赖jna.jar
jna.jar下载地址:http://central.maven.org/maven2/net/java/dev/jna/jna/4.5.1/jna-4.5.1.jar
将jar包引入到项目中
Test.java代码如下:
package jnaTestNew; import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary; public class Test { public interface CLibraryTest extends Library { //将so库放到/usr/lib64目录下
//注意名称要去掉lib前缀和.so的后缀
// CLibraryTest INSTANCE = (CLibraryTest) Native.loadLibrary("test", CLibraryTest.class); //将so库放在非系统目录下,以绝对路径的方式引用
CLibraryTest INSTANCE = (CLibraryTest) Native.loadLibrary("test", CLibraryTest.class, NativeLibrary.getInstance("/home/keysystem/jnaTest/libtest.so").getOptions()); int add(int a, int b); } public static void main(String[] args) {
int a = 6;
int b = 6; int c = CLibraryTest.INSTANCE.add(a, b);
System.out.println("a:" + a);
System.out.println("b:" + b);
System.out.println("c为a+b的和:");
System.out.println("c:" + c);
} }
其中重点关注so库放置的位置,可以是系统目录即/usr/lib64目录下(64位的操作系统和JDK);
也可以放置在任意可访问路径下,以绝对路径引用,使用方法参见上面的代码。
4、将java Project项目export导出jar包,如test.jar
将jar包放到Linux系统上执行java -jar test.jar
调用情况如下:
[keysystem@localhost jnaTest]$ ll -rlt
total
-rw-rw-r--. keysystem keysystem Apr : test.c
-rw-rw-r--. keysystem keysystem Apr : test.jar
-rw-rw-r--. keysystem keysystem Apr : test.o
-rwxrwxr-x. keysystem keysystem Apr : libtest.so
[keysystem@localhost jnaTest]$ /home/keysystem/jnaTest
[keysystem@localhost jnaTest]$ java -jar test.jar
a:
b:
c为a+b的和:
c:
Hello, this method is used to add two Integer.[keysystem@localhost jnaTest]$
使用过程中需要注意代码里的so库路径要与so库存放路径一致。
JNA的用法的更多相关文章
- Java中jna的用法
(1)jna是对jni的封装,让java使用者能更好的使用本地的动态库 (2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对 ...
- java高级用法之:JNA中的Structure
目录 简介 native中的struct Structure 特殊类型的Structure 结构体数组作为参数 结构体数组作为返回值 结构体中的结构体 结构体中的数组 结构体中的可变字段 结构体中的只 ...
- java高级用法之:调用本地方法的利器JNA
目录 简介 JNA初探 JNA加载native lib的流程 本地方法中的结构体参数 总结 简介 JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native inter ...
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
目录 简介 Library Mapping Function Mapping Invocation Mapping 防止VM崩溃 性能考虑 总结 简介 不管是JNI还是JNA,最终调用的都是nativ ...
- java高级用法之:在JNA中使用类型映射
目录 简介 类型映射的本质 TypeMapper NativeMapped 总结 简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比较简 ...
- java高级用法之:JNA类型映射应该注意的问题
目录 简介 String Buffers,Memory,数组和Pointer 可变参数 总结 简介 JNA提供JAVA类型和native类型的映射关系,但是这一种映射关系只是一个大概的映射,我们在实际 ...
- java高级用法之:JNA中的Memory和Pointer
目录 简介 Pointer 特殊的Pointer:Opaque Memory 总结 简介 我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer.除了Pointer之外, ...
- java高级用法之:JNA中的Function
目录 简介 function的定义 Function的实际应用 总结 简介 在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface ma ...
- java高级用法之:JNA中的回调
目录 简介 JNA中的Callback callback的应用 callback的定义 callback的获取和应用 在多线程环境中使用callback 总结 简介 什么是callback呢?简单点说 ...
随机推荐
- 第五模块·WEB开发基础-第3章jQuery&Bootstrap
01-jQuery介绍 02-如何使用jQuery 03-jQuery的入口函数 04-jQuery对象和JS对象的相互转换 05-jQuery如何操作DOM 06-底层选择器 07-基本过滤器 08 ...
- python程序设计——面向对象程序设计:类
理解面向对象 基本原则是,计算机程序由多个能够起到子程序作用的单元或对象组合而成 关键性观念是,数据以及对数据的操作封装在一起,组成一个相互依存.不可分割的整体,即对象 python面向对象特性 完全 ...
- 测试模拟 白屏 / FOUC
白屏和FOUC 白屏与无样式内容闪烁(FOUC)是因为不同浏览器加载与显示页面的机制不同而造成的. 我们可以通过一个实验来进行测试和模拟白屏.FOUC的现象,让我们更好的理解白屏.FOUC. 测试de ...
- 150命令之线上查询及帮助命令 man hellp
150命令之线上查询及帮助命令 man 查询命令的帮助 man + 命令 NAME ls - list directory contents 命令+命令简单说明 SYNOPSIS ...
- HTMLTestRunner解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128)
其中HTML和数据库都是设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是python的str默认是ascii编码,和unicode编码冲突,就会报这个标题错误. ...
- HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description One day, a hunter named James went to a mysterious area to find the treasures. J ...
- 常用linux命令相关
[查看端口] netstat -tlnp netstat命令 netstat -an | grep 3306 3306替换成需要grep的端口号 lsof命令 通过list open file命令可以 ...
- nginx 添加的配置信息
使用logrotate管理Nginx日志配置如下: [root@vm-10-129-93-51 nginx]# vi /etc/logrotate.d/nginx /letv/log/nginx/*. ...
- c# throw抛出上一个异常
catch(exception e) { throw; } 不仅抛出这次的异常,也抛出之前的异常. 用法示例:函数A调用函数B,A用到此throw时,B中发生的异常也会继承过来. catch(exce ...
- WIN8/8.1/10进入BIOS方法图解
1.首先点击桌面左下角的"开始". 2.然后点击电源. 3.然后按住shift,同时点击"重启".于是进入这个画面: 4.然后点击"疑难解答" ...