啰嗦话不多说,网上很多这方面的教程,但是我也看了好久也能运行一个成功的例子,因为很多地方都忽略了
下面来演示个完整的jna例子
1. 随便使用个c或c++开发工具(我用的VC++6.0)
打开软件新建个dll工程,VC里面是win32 dynamic-link library,输入工程名称后点击下一步,然后再选a simple dll project,第一项是空的project,我比较懒就选第二个,有简单的文件存在,然后自己拿来改下,最后确定就能看到工程已经建好了
2. 写C的接口文件,就是以.h结尾的那个文件,选择文件-->新建-->C/C++Header File文件,然后就能看到工程的header文件中有了个新的.h文件(我起的名字是test)
然后打开test.h文件,声明我的接口咯
这里值得注意的地方是必须写(extern "c"的声明,不然到时候使用Java的jna是不可能匹配到这个方法的,很明显会抛出异常java.lang.UnsatisfiedLinkError: Error looking up function 'add': ÕҲ»µ½ָ¶¨µ),这个文件相当于我们的java中的interface,你可以这样理解
- extern "C" _declspec(dllexport)
- int add(int first, int second);
3. 写C接口的实现类,如何实现这个add方法
打开source file很明显看到有一个文件是xxx.cpp(xxx是以你的工程名字来定的), 另外一个是stdafx.cpp, 这个不需要管他, 我们就在xxx.cpp中写代码吧
xxx.cpp原本就存在内容,你不喜欢的,可以直接新建一个source file
- // sss.cpp : Defines the entry point for the DLL application.
- //
- #include "stdafx.h"
- BOOL APIENTRY DllMain( HANDLE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- return TRUE;
- }
然后我们在这些内容下添加我们的add方法实现,要include我们刚刚写的test.h文件
- // sss.cpp : Defines the entry point for the DLL application.
- //
- #include "stdafx.h"
- #include "test.h"
- BOOL APIENTRY DllMain( HANDLE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- return TRUE;
- }
- int add(int a, int b){
- return a+b;
- }
4. C方面的基本的完成了,最后就是打包成dll,直接按F7,全自动打包,然后找到这个工程的目录下,看到有一个debug的文件夹,里面就有一个dll,等下直接扔到java工程中
5. 打开eclipse新建一个java project, 把刚刚的dll拷贝到工程的目录下点着工程的名字,然后黏贴下去就可以了, 然后随便在网上找个jna.jar文件,build path到这个工程中
然后开始我们的java接口, loadLibrary第一个参数就是你的dll名字,第二个就是当前接口的.class类型,接口里面的方法名要跟C的接口方法名一直
- public interface TestJNA extends StdCallLibrary {
- public abstract int add(int a, int b);
- TestJNA INSTANCE = (TestJNA) Native.loadLibrary("test", TestJNA.class);
- }
写完就调用测试下
- public class TEST {
- /**
- * @param args
- */
- public static void main(String[] args) {
- System.out.println(TestJNA.INSTANCE.add(1, 2));
- }
- }
相关推荐
#### 二、JNA实例分析 根据题目提供的信息,本节将详细解析一个JNA的应用实例。首先,我们将介绍C语言源代码部分,然后是Java源代码部分。 ### C语言源代码分析 C语言源代码主要定义了几个函数和结构体,包括: -...
本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...
这个实例是关于如何使用JNA来调用DLL(动态链接库)的教程,特别强调了在调用过程中可能出现的中文乱码问题以及如何解决这个问题。 首先,我们需要理解JNA的工作原理。JNA通过提供一个接口定义,让Java代码能够映射...
本实例将详细介绍如何使用JNA调用DLL动态链接库,通过一个超简单的Demo来展示其过程。 首先,我们需要了解JNA的基本工作原理。JNA通过映射Java方法到本地库中的函数,实现了跨语言的通信。在Java中,我们定义一个...
本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括基本数据类型、指针、结构体、回调函数、字符串以及数组。 首先,理解JNA的基本工作原理至关重要。JNA通过映射DLL中的函数到Java类的方法来实现...
**JNA.jar与实例应用** Java Native Access (JNA) 是Java平台上的一个库,它允许Java代码直接调用本地(操作系统级)函数,而无需编写C代码或使用Java Native Interface (JNI)。JNA.jar是JNA的核心库,包含了JNA的...
针对现如今最新版JNA读取本地window event的实例 供参考
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA通过映射Java方法到本地库中的函数,实现了Java与C...
例如,如果你需要调用Windows API中的某个函数,你可以创建一个接口,然后通过JNA的Platform类加载相应的库,并实例化该接口,就可以直接调用本地函数了。 使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如...
标题"MYJNA.zip JNA完整的使用例子"暗示了这是一个关于Java Native Access (JNA) 的示例项目,其中包含了多个演示如何在Java代码中调用C/C++原生函数的实例。JNA是Java平台上的一个库,允许Java程序直接调用操作系统...
其次,`jna-master.zip`文件则可能是JNA项目的源码或一个包含更完整资源的版本。通常,`master`分支代表了一个开源项目的主分支,包含最新的开发成果和稳定版本。解压这个文件后,用户可以查看JNA的源代码,了解其...
NLPIR分词JNA实例,直接导入就可以使用。
在实际开发中,导入JNA和jna-platform的jar包后,可以通过定义Java类来映射C/C++的结构体,通过Interface来定义要调用的函数,然后实例化并调用这些函数。例如: ```java import com.sun.jna.Library; import ...
然后,我们使用`Native.load`加载`kernel32.dll`库,并实例化`Kernel32`接口。 总的来说,JNA-5.7.0和jna-platform-5.7.0是Java开发中非常实用的工具,它们极大地降低了与本地系统交互的复杂性,使得Java开发者可以...
本文将详细介绍如何通过Java Native Access (JNA) 库来实现Java调用DLL动态库,以"NetSdk.dll"为例进行实战演示。 JNA是Java平台上的一个开源库,它允许Java代码直接调用本机库(如DLL或.so文件),而无需编写C语言...
在标题和描述中提到的"jna 现成的java调用jna项目 包括jna.jar",意味着这是一个包含JNA库的项目,其中的`jna.jar`文件是JNA的核心组件。 **JNA的工作原理:** JNA通过动态加载本地库并在Java中定义相应的接口来...
在Java中调用返回结构体的C函数,可以使用`PointerByReference`来接收结果,因为JNA无法直接返回结构体实例。例如: ```java Library lib = Library.INSTANCE; // Library是你的JNA接口,里面定义了C函数的签名 ...
- **实例化**:通过`Native.loadLibrary`方法加载对应的本机库,并创建接口实例。 - **方法调用**:定义了一个`printf`方法,用于调用本机库中的`printf`函数。 通过以上知识点的总结,我们可以了解到JNA如何简化了...
3. 调用函数:通过接口实例调用本地函数,例如`User32.INSTANCE.SetWindowLong(hwnd, nIndex, newLong)`。 三、JNA实践:JFrame透明与不规则形状 1. JFrame透明:JNA可以用来调用Windows API,实现JFrame的透明...