- 浏览: 7338818 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
如何通过JNA调用Linux系统自带的libc.so动态库的printf函数,现在再通过一个简单的例子介绍如何通过JNA调用自己编写的C动态库并在动态库中调用Java的函数(回调)。
编写C代码:
#include <stdio.h>
static int (*AddByCallback)(int a,int b)=NULL;
void RegisterAdd(int (*callback)(int,int))
{
AddByCallback=callback;
}
void DoAddByCallback(int a,int b)
{
int res;
if(AddByCallback==NULL)
{
printf("error: please register the Add function first!\n");
return;
}
res=AddByCallback(a,b);
printf("Java execute add: %d+%d=%d\n",a,b,res);
}
2.编译C代码:
gdyt:/home/yc/soft/test # ll
total 36
-rwxr-xr-x 1 root root 5812 Dec 22 23:14 libtest.so
-rw-r--r-- 1 root root 61 Dec 22 23:14 test.c
-rw-r--r-- 1 root root 367 Dec 22 23:17 testcallback.c
-rwxr-xr-x 1 root root 19584 Dec 22 23:14 testlib.c
gdyt:/home/yc/soft/test # gcc -fPIC -shared testcallback.c -o libtestcallback.so
gdyt:/home/yc/soft/test # ll
total 48
-rwxr-xr-x 1 root root 5812 Dec 22 23:14 libtest.so
-rwxr-xr-x 1 root root 9887 Dec 22 23:19 libtestcallback.so
-rw-r--r-- 1 root root 61 Dec 22 23:14 test.c
-rw-r--r-- 1 root root 367 Dec 22 23:17 testcallback.c
-rwxr-xr-x 1 root root 19584 Dec 22 23:14 testlib.c
3.查看so并拷贝到lib目录
查看so的依赖关系
gdyt:/home/yc/soft/test # ldd libtestcallback.so
linux-vdso.so.1 => (0x00007fff24dfe000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc91c7ea000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc91cd78000)
添加相关的连接
gdyt:/home/yc/soft/test # ln -s libtestcallback.so libJnaCbApi.so.6
gdyt:/home/yc/soft/test # ll
total 48
lrwxrwxrwx 1 root root 18 Dec 22 23:24 libJnaCbApi.so.6 -> libtestcallback.so
-rwxr-xr-x 1 root root 5812 Dec 22 23:14 libtest.so
-rwxr-xr-x 1 root root 9887 Dec 22 23:19 libtestcallback.so
-rw-r--r-- 1 root root 61 Dec 22 23:14 test.c
-rw-r--r-- 1 root root 367 Dec 22 23:17 testcallback.c
-rwxr-xr-x 1 root root 19584 Dec 22 23:14 testlib.c
查看相关的依赖关系
gdyt:/home/yc/soft/test # ldd libJnaCbApi.so.6
linux-vdso.so.1 => (0x00007fffe95ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb9e101d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb9e15ab000)
4.拷贝到lib目录
gdyt:/home/yc/soft/test # cp libtestcallback.so lib/
5.编写Java代码:
package com.etrip;
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
*
* @Title: TODO
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:
* @Date:2012-12-22
* @author longgangbai
* @version 1.0
*/
public class JNACallback {
// 定义接口CLibrary,继承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定义接口JavaCallbackAdd,继承自com.sun.jna.Callback
interface JavaCallbackAdd extends Callback {
int CallbackAdd(int a, int b);
}
// 动态库的函数声明
void RegisterAdd(JavaCallbackAdd callback);
void DoAddByCallback(int a, int b);
}
public static void main(String[] args) {
// 接口实例化并初始化实例
CLibrary lib = (CLibrary) Native
.loadLibrary("JnaCbApi", CLibrary.class);
if(lib!=null){
System.out.println("JnaCbApi加载成功...");
}
CLibrary.JavaCallbackAdd callback = new CLibrary.JavaCallbackAdd() {
// 实现CallbackAdd函数
public int CallbackAdd(int a, int b) {
return a + b;
}
};
// 调用动态库的函数
lib.RegisterAdd(callback);
// 由动态库执行CallbackAdd回调函数
lib.DoAddByCallback(1, 2);
}
}
6.测试
发表评论
-
【转】Django resources
2014-01-23 14:35 10827Django resources This page li ... -
使用国内镜像源来加速python pypi包的安装
2014-01-16 11:16 197842pipy国内镜像目前有: http://pypi.d ... -
[转 ]vagrant使用简介
2014-01-10 13:53 257501> 简介: vagrant提供了易于配置,重复性 ... -
[转]在Java中调用Python
2014-01-07 13:08 9219在执行之前都需要把jython对应的包加载进去,这个是必须的 ... -
[转]Eclipse配置PyDev插件
2014-01-02 14:25 2839安装python解释器 安装PyDev: 首 ... -
RestFuse的研究(五) Http请求的封装
2014-06-14 15:50 3647在RestFuse中封装了Http请 ... -
RestFuse的研究(四) Junit的Statement的分析
2013-12-06 11:46 1673在RestFuse提供了多种单 ... -
RestFuse的研究(三) Junit的Rule的使用和分析
2013-12-06 11:01 2238在junit中定义一些可以公用的规则(R ... -
RestFuse的研究(二) Junit的Runner的分类和模式
2013-12-06 10:40 1604在Junit4中的调用JunitCore可以采 ... -
RestFuse的研究(一) HttpJunitRunner的实现
2013-12-06 10:11 1747在RestFuse是一种针对Rest We ... -
[转]An open-source JUnit extension to test HTTP/REST APIs
2013-12-06 09:57 1100http://developer.eclipsesource ... -
TestNG简单的学习(十三)TestNG中Junit的实现
2013-12-04 09:00 3355TestNG和junit的整合 ... -
TestNG简单的学习(十二)TestNG运行
2013-12-03 09:08 51587文档来自官方地址: ... -
TestNG简单的学习(十一)TestNG学习总结
2013-12-03 09:08 14198最近一直在学习关于TestNG方面的知识,根 ... -
TestNG简单的学习(十)TestNG @Listeners 的使用
2013-12-03 09:07 8694TestNG官方网站: http://testng.or ... -
TestNG简单的学习(九)TestNG Method Interceptors 的使用
2013-12-03 09:07 2714TestNG官方网站: http://testng ... -
TestNG简单的学习(八)TestNG Annotation Transformers 的使用
2013-12-03 09:07 2810TestNG官方网站: http://testng.or ... -
TestNG简单的学习(七)TestNG编程方式运行
2013-12-02 09:22 2454TestNG官方网站: http://testng.or ... -
TestNG简单的学习(六)测试工厂注释的使用
2013-12-02 09:22 2784TestNG官方网站: http://testng.or ... -
TestNG简单的学习(五)参数化测试数据的定制
2013-12-02 09:22 2702TestNG官方网站: http://testng.or ...
相关推荐
4. **回调支持**:JNA支持Java方法作为本地函数的回调,这在处理事件驱动或异步操作时非常有用。 5. **内存管理**:JNA自动管理内存,无需手动处理`NewGlobalRef`等操作,但需要注意的是,如果本地函数返回Java对象...
3. **回调函数**:在C/C++编程中,回调函数是指被其他函数调用的函数。在Java通过JNA调用DLL时,如果DLL函数需要一个回调函数作为参数,那么Java需要定义一个接口,该接口的方法将作为回调函数的实现,JNA会处理这个...
实现,JNA会自动加载对应的动态库并调用其中的方法。 3. **处理.dll和.so文件**: - **Windows (.dll)**:在Windows系统中,.dll文件是动态链接库,包含了可由多个程序共享的函数和数据。将.dll文件放在应用程序的...
通过这个项目,开发者可以学习如何使用JNA进行跨语言调用,以及如何实现在Java中调用C/C++的回调函数。 ### 5. 应用场景 JNA广泛应用于各种场景,包括系统调用、硬件控制、图形界面、加密解密、性能优化等。由于其...
7. **回调和异步调用**:JNA也支持Java方法作为本地函数的回调,以及异步调用模式,这对于实现复杂的交互逻辑很有帮助。 8. **错误处理**:JNA通过异常处理机制报告本地调用的错误,如`LastErrorException`用于捕获...
4. **Callback 机制**: JNA 还支持从本地库回调Java方法,这使得可以在本地库中调用Java实现的函数。 **JNA 调用DLL步骤** 1. **创建接口**: 创建一个Java接口,声明本地库中的函数签名。每个方法都应使用`native`...
JNA通过动态加载库和映射库函数来实现这一功能,极大地简化了Java与C/C++等本地代码之间的交互。在本文中,我们将深入探讨如何使用JNA jar包来实现Java调用dll文件。 首先,理解JNA的工作原理至关重要。JNA依赖于...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接调用操作系统底层的动态链接库(DLL on Windows, SO on Linux/Unix)。JNA 3.3.0是...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的中间层,极大地简化了Java与本地操作系统接口的交互。JNA 3.2.1是该库的一个版本,提供了对...
4. **回调函数**:JNA 支持从本地代码回调 Java 方法,使得 Java 可以作为事件处理器或回调函数的实现。 5. **结构体和联合体**:JNA 支持 Java 中的类映射到本地结构体或联合体,可以包含嵌套结构、数组、指针等...
此外,JNA还支持回调(callbacks),使得C函数能够调用Java代码成为可能。 使用JNA的步骤通常包括以下几个部分: 1. 引入JNA库:首先需要将`jna.jar`添加到项目的类路径中,这可以通过IDE的配置或者构建工具(如...
4. **回调函数**:JNA支持从本地库调用Java方法,只需要将Java方法作为参数传递给本地函数即可。 5. **内存管理**:JNA自动处理内存管理,包括分配和释放内存。但是,对于复杂的数据结构,用户可能需要手动管理内存...
Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要依赖于Java Native Access (JNA) 库。JNA提供了一种无需编写本地代码(如C/C++)即可与本地平台API进行交互的方式,包括Windows上的DLL、Unix上的共享库...
描述中的“JNA的强大功能方便地调用动态链接库中的C函数”进一步强调了JNA的主要优点:它的易用性和灵活性,使得即使对C编程不熟悉的Java开发者也能轻松地利用本地库。 JNA的使用流程通常包括以下几个步骤: 1. **...
它还支持回调函数,允许本地代码调用Java方法。此外,JNA还提供了一个动态类型系统,可以在运行时根据参数来确定函数调用的类型,这在处理不同平台或库的变体时非常有用。 在实际应用中,JNA常用于访问操作系统服务...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的中间层,如JNI(Java Native Interface)。JNA通过提供一种抽象的方式来映射原生函数,使得...
JNA还支持复杂的数据类型,包括结构体和联合,以及回调函数。通过自定义`Structure`子类,你可以定义Java类来表示本地结构体,并通过`ByReference`或`ByValue`类作为参数传递。 此外,JNA还包括一个Platform库,...
7. **回调函数**:JNA支持将Java方法作为参数传递给原生代码,这需要创建一个实现了特定接口的类,并使用`Callback`注解标记方法。 除了基础功能,JNA还包括了一些高级特性,如自动类型映射、内存管理、自定义类型...
4. **回调机制**:JNA支持将Java方法作为本地函数的回调,这样可以在本地代码中调用Java代码,增强了灵活性。 5. **平台兼容性**:JNA支持多种操作系统,包括Windows、Linux、macOS、Solaris等。它能够自动检测目标...