记得以前 Java 要调用C/C++写得动态库都是用的 JNI 方式,还需要自己写不少 C/C++ 代码。比如说要在Java中调用已有的动态库,如 Windows 的 user32.dll 的方法 MessageBoxA,具体步骤是 Java 中声明一个 native 方法,然后用 javah 命令生成JNI样式的头文件,再自己实现头文件中声明的方法,在实现方法中装载动态库 user32.dll,调用 MessageBoxA 方法,需要把自己写的这部分 C/C++ 代码封装成一个动态库,如Sample.dll,最后在 java 中装载 Sample.dll,然后执行其中所声明的本地方法。
可见,用老实的JNI方式,我们在调用一个已知动态库的时候还需要额外生成一个符合JNI规则的动态库作为桥梁,显得有点多余了。
下面我将引入一个开源的组件 JNative,在 http://sourceforge.net/projects/jnative 下载(我是通过在sourceforge中输入java dll搜索到的),通过它调用已有动态库中的方法就非常的方便,因为中间的JNI处理过程它都为我们做好了。JNative 现在还是 Beta1 版,期待正式版的出炉,还不知道这个版本将会有什么Bug出现。
我们下载到的 jnative 的目录中可以看到三个文件,分别是 JNative.dll,libjnative.so,JNative.jar
JNative.dll 为 Windows 平台下用的,可以拷到相应的lib加载路径,如user.dir、path、system32或windows目录下
libnative.so 为Linux平台下用的,可以拷到相应的lib加载路径,如user.dir、path目录下
JNative.jar 这个就是我们编程时候要用的
在下载的 jnatidve 的源代码中有示例代码,观看代码 org\xvolks\test\JNativeTester.java 就知道 jnative 是如何调用动态库方法的
如代码行 User32.messageBox(0, "Demonstrates JNative in action with many Win32 calls", "Welcome to JNative", 0);
是调用的类 User32 的 messageBox 方法,而messageBox的代码是
public static final int messageBox(int parentHandle, String message,
String caption, int buttons)
throws NativeException, IllegalAccessException {
JNative n = null;
try {
n = new JNative(DLL_NAME, "MessageBoxA"); // 常量DLL_NAME的值为User32.dll
// 构造JNative时完成装载User32.dll,并且定位MessageBoxA方法
n.setRetVal(Type.INT); // 指定返回参数的类型
int i = 0;
n.setParameter(i++, Type.INT, "" + parentHandle);
n.setParameter(i++, Type.STRING, message);
n.setParameter(i++, Type.STRING, caption);
n.setParameter(i++, Type.INT, "" + buttons); // 指定位置上的参数类型和值
n.invoke(); // 调用方法
return Integer.parseInt(n.getRetVal());
} finally {
if (n != null)
n.dispose(); // 记得释放
}
}
上面的注释是我加上去的。
Type有一种叫做Type.PSTRUCT枚举值,对C/C++中结构的处理都考虑到了,只要用JNative的Pointer类的实例来与结构对应就行了。org\xvolks\test\SNDPTester.java中演示了如何传递C/C++中的结构相对应的Java数据类型,也就是怎么封装成一个JNative的Pointer类型。
还有在JNative中用了JDK1.5的一些特性,如枚举、静态引入等,所以在JDK1.4下是不能用的。
分享到:
相关推荐
本主题聚焦于“Java调用C++动态库”,这是一个关键的技术,它允许Java应用程序利用C++编写的高效库,比如图形处理、硬件驱动或者算法实现等。这种技术主要依赖于Java Native Interface (JNI),它是Java平台标准的一...
### Java调用动态库最简便方法 #### 引言 在跨语言开发中,Java调用其他语言(如C/C++)编写的动态链接库(DLL)是一种常见的需求。传统上,这种调用通常依赖于Java Native Interface (JNI),但这种方法涉及到较为...
Java调用COM组件是Java与非Java环境交互的一种方式,主要应用于Windows平台,因为COM(Component Object Model)是微软提出的一种面向对象的技术,主要用于构建Windows应用程序和服务。在Java中调用COM组件,可以...
标题"java调用c#样例"指的是使用Java语言通过Jacob库调用C#编写的动态链接库(DLL)。C# DLL通常包含.NET Framework中的方法和功能,而Java应用程序可以借助Jacob库来访问这些功能,从而实现跨语言的互操作性。 ...
`JNative-1.3.2`是一个开源组件,专门设计用于帮助Java应用程序调用Windows平台上的DLL(动态链接库)文件,同时也支持Linux平台下的SO(共享对象)文件。下面我们将详细介绍这个组件的使用方法、工作原理及相关知识...
### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...
1. Java调用DLL的原理和方法,包括JNI和JNA的使用。 2. 如何在Java中通过JACOB等工具与OCX控件进行交互。 3. "EdisonSmsGw.ocx"的具体应用,可能涉及到短信服务的实现。 4. 实际的Java代码示例,供学习和参考。 ...
- C# DLL的源码,展示了如何定义公共接口和方法供Java调用。 - Java调用DLL的源码,展示了如何使用JNA或IKVM.NET等工具进行调用。 - 测试代码,用于验证Java成功调用C# DLL并执行预期功能。 要正确使用这些源码,你...
在软件开发过程中,有时需要将不同编程语言...在上述示例中,两种方法都展示了如何从Java调用Delphi DLL,实现特定的功能,例如输出文本到控制台。在实际开发中,可以根据项目的具体需求和团队技术栈来选择合适的方法。
本主题聚焦于如何使用Java调用由C#编写的DLL(动态链接库)文件。这种技术通常应用于系统集成、利用已有的C#组件或者服务,以及实现多语言环境下的协作开发。下面将详细阐述这个过程。 首先,C#编写的DLL是.NET框架...
Java调用DLL的工具JNative是为了解决Java应用程序与本地动态链接库(DLL)交互问题而设计的一个开源组件。在传统的Java开发中,如果需要调用非Java编写的库,比如C或C++编译的DLL,通常会使用JNI(Java Native ...
标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来调用Windows平台上的动态链接库(.dll文件)所需的Java类库。这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA...
`jacob.dll`是JACOB的动态链接库,负责实现Java和COM之间的通信,而`jacob.jar`则包含Java类库,提供了Java调用COM的API。 要在Java项目中使用JACOB,你需要进行以下步骤: 1. **添加依赖**:首先,将`jacob.jar`...
在IT行业中,跨语言通信是一项常见的任务,尤其是在大型系统中,不同组件可能由不同语言编写。...提供的"Java调用C#的DLL实现方案.docx"文档应该会详细解释这些方法的步骤和示例代码,建议仔细阅读。
本篇文章将探讨如何在Java中调用C#编写的DLL(动态链接库)文件,这通常涉及到了Java的JNI(Java Native Interface)技术以及C#的COM(组件对象模型)或者.NET Interop服务。 首先,C# DLL是.NET Framework的一部分...
Java调用DLL和OCX是跨语言交互的一个重要应用场景,主要涉及到Java的本地接口(Java Native Interface,JNI)和第三方库如Jacob项目。Jacob是一个Java和COM(Component Object Model)之间桥梁的开源库,它允许Java...
首先,Java调用DLL主要依赖于第三方库,如Jacob项目。Jacob是一个Java到COM桥接库,它提供了在Java中调用COM组件和DLL函数的能力。在这个压缩包中,包含了Jacob的源码和库文件:`jacob-1.14M7_src.zip` 和 `jacob-...
Java调用DLL(动态链接库)和ActiveX控件是跨平台编程中常见的技术,尤其在需要与Windows系统原生功能交互时。`njawin`框架为Java开发者提供了一个简便的方法来实现这一目标,使得Java应用程序能够利用DLL和ActiveX...
Java是一种广泛使用的编程语言,它以其跨平台特性而著名,但在与底层系统交互时,比如调用Windows操作系统的动态链接库(DLL)文件,Java原生支持并不充分。在这种情况下,开发者可以借助第三方库来实现这样的功能。...