Java调用C语言Dll库回调函数
2014-06-12 11:06
405 查看
之前开发的项目里需要用到一种电子设备,而电子设备的操作接口是用C语言开发,而我们的项目是用Java进行开发,所以就涉及到了Java调用C语言Dll库回调函数问题,在网上找了很多资料,但是真正好用的很少,反复测试最终把这个问题得以解决。
今天有时间就把这些整理一下,希望可以帮到以后遇到此类问题的猿猿们。
使用Java调用DLL动态链接库的方案有很多,如:JNA、JNI、Jawin、Jacob等,而此次用到的是JNA,关于JNA的简介可以参考百度百科,这里就不再多说。
这里首先看一下C语言库的源代码,sa.h:这里定义了一个带回调函数的方法和一个普通方法
#ifndef _SA_H
#define _SA_H
#ifdef API_EXPORT
#define API_DLL _declspec(dllexport)
#else
#define API_DLL _declspec(dllimport)
#endif
typedef void (__stdcall *CALLBACK_FUN)(int x);
extern "C" API_DLL void printfValue(CALLBACK_FUN f);
extern "C" API_DLL int Calc(int xa);
#endif sa.app源代码如下:
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class SaDllCallbackFunctionTest {
DllLib1 cf = null;
public boolean init() {
try {
cf = (DllLib1) Native.loadLibrary("sa.dll",DllLib1.class);
if (cf != null)
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] arg0){
SaDllCallbackFunctionTest ope = new SaDllCallbackFunctionTest();
if(ope.init()){
System.out.println(ope.cf.Calc(200));;
DllLib1.CallbackFunctionImpl FUN_CMC = new DllLib1.CallbackFunctionImpl();
ope.cf.printfValue(FUN_CMC);
}
}
}
interface DllLib1 extends StdCallLibrary {
public int Calc(int x);
public void printfValue(CallbackFunctionImpl FUN_CMC);
public interface CallbackFunction extends StdCallCallback {
public void CALLBACK_FUN(int a);
}
public class CallbackFunctionImpl implements CallbackFunction {
public void CALLBACK_FUN(int a) {
System.out.println("========" + a);
}
}
}
今天有时间就把这些整理一下,希望可以帮到以后遇到此类问题的猿猿们。
使用Java调用DLL动态链接库的方案有很多,如:JNA、JNI、Jawin、Jacob等,而此次用到的是JNA,关于JNA的简介可以参考百度百科,这里就不再多说。
这里首先看一下C语言库的源代码,sa.h:这里定义了一个带回调函数的方法和一个普通方法
#ifndef _SA_H
#define _SA_H
#ifdef API_EXPORT
#define API_DLL _declspec(dllexport)
#else
#define API_DLL _declspec(dllimport)
#endif
typedef void (__stdcall *CALLBACK_FUN)(int x);
extern "C" API_DLL void printfValue(CALLBACK_FUN f);
extern "C" API_DLL int Calc(int xa);
#endif sa.app源代码如下:
#include "stdafx.h" #define API #include "sa.h" CALLBACK_FUN fun; int x = 200; char str[] = "abcd"; void printfValue(CALLBACK_FUN f) { fun = f; fun(x); } int Calc(int xa) { x = xa; return x; }Java源代码如下:
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class SaDllCallbackFunctionTest {
DllLib1 cf = null;
public boolean init() {
try {
cf = (DllLib1) Native.loadLibrary("sa.dll",DllLib1.class);
if (cf != null)
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] arg0){
SaDllCallbackFunctionTest ope = new SaDllCallbackFunctionTest();
if(ope.init()){
System.out.println(ope.cf.Calc(200));;
DllLib1.CallbackFunctionImpl FUN_CMC = new DllLib1.CallbackFunctionImpl();
ope.cf.printfValue(FUN_CMC);
}
}
}
interface DllLib1 extends StdCallLibrary {
public int Calc(int x);
public void printfValue(CallbackFunctionImpl FUN_CMC);
public interface CallbackFunction extends StdCallCallback {
public void CALLBACK_FUN(int a);
}
public class CallbackFunctionImpl implements CallbackFunction {
public void CALLBACK_FUN(int a) {
System.out.println("========" + a);
}
}
}
相关文章推荐
- Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回
- JAVA调用C语言的dll库(使用Dev C++创建Dll)
- JNI 使用总结 (JAVA 调用C语言编写的DLL/SO/SL文件)
- linux下 java JNI调用C语言动态链接库
- 跨操作系统的JNI入门(Java调用C语言)
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- Java调用dll库源码
- java调用C语言
- Java通过JNI调用C语言的方法
- Eclipse中java工程中引用dll库的路径设置 && System.loadLibrary()调用Dll路径问题
- JNI学习------C语言调用Java (转)
- java中调用C语言代码
- C语言调用 Java(Linux)
- Java通过JNI调用C语言的方法
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库(非常使用!!非常经典!!)
- Java 与 C语言互调用用之简单实践
- 如何用C语言调用JAVA的类
- JNI------Java调用C语言中的MessageBox
- JNI学习--通过Java应用调用C语言的函数打印hello,world