【CSDN常见问题解答】使用JNA调用Windows动态库
来源:互联网 发布:腾讯云数据库招聘 编辑:程序博客网 时间:2024/05/22 05:32
Java中调用Windows平台的动态库一般会使用JNI(Java Native Interface)还有JNA(Java Native Access)。
首先解释下为什么我会选用JNA,一句话来说就是使用简单。
我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。 如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的 dll/so中公布的函数。然后再在Java中载入这个适配器dll/so,再编写Java native函数作为dll中函数的代理。
经过2个繁琐的步骤才能在Java中调用本地代码。因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!所以我们就选择JNA来写几个简单的demo。
JNA在GitHub上的地址:https://github.com/twall/jna
需要jar包,到lib文件夹里面去下载。
第一个例子:
import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.Platform;public class HelloWorld {public interface CLibrary extends Library {CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);void printf(String format, Object... args);}public static void main(String[] args) {CLibrary.INSTANCE.printf("Hello World, ");for (int i = 0; i < args.length; i++) {CLibrary.INSTANCE.printf("Argument %d: %s, ", i, args[i]);}}}
运行上面的代码,我给main函数传递了3个参数1 2 3,打印如下:
Hello World, Argument 0: 1, Argument 1: 2, Argument 2: 3,
但是,请注意,这个程序实际上是使用msvcrt.dll这个C运行时库中的printf函数打印出上面这些字符的。是不是很简单,不需要写一行C代码,就可以直接在Java中调用外部动态链接库中的函数!
第二个例子:
上面那个例子使用了操作系统自带的动态链接库,现在我们再自己写一个动态链接库试试。
1,在VS中选择C++语言,然后选择创建一个Win32程序。选择dll类型。
2,发布的C函数是:
#define MYLIBAPI extern "C" __declspec(dllexport ) MYLIBAPIvoid say(wchar_t* pValue);
这个函数的实现是:
void say(wchar_t* pValue){ std::wcout.imbue(std::locale("chs")); std::wcout<<L"他说:"<<pValue<<std::endl;}
它需要传入一个Unicode编码的字符数组。然后在控制台上打印出一段中文字符。
3,生成dll(TestDll1.dll)。然后把生成的dll文件复制到Eclipse项目中,放在项目下面。
4,然后编写下面的类:
import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.WString;public class TestDll1Service { public interface TestDll1 extends Library { /** * 当前路径是在项目下,而不是bin输出目录下。 */ TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class); public void say(WString value); } public TestDll1Service() { } /** * @param args */ public static void main(String[] args) { TestDll1.INSTANCE.say(new WString("Hello World!")); System.out.println("你好,我是来测试的!"); }}
5,执行这个Java类。可以看到控制台下如下输出:
他说: Hello World!
你好,我是来测试的!
6,上面一行是C语言使用C++的std::wcout输出的。 下面一行是Java语言输出的。
6 0
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- 使用JNA 调用WINDOWS API
- Jna调用动态链接库
- 使用JNA框架调用dll动态链接库
- 【CSDN常见问题解答】Javap 的使用
- linux jna调用so动态库
- JNA调用C动态库dll、so
- JNA方式调用dll动态库
- JNA调用C语言动态链接库
- Java中使用JNA调用其他语言编写的动态链接库
- Windows上使用JNA调用自己编写的DLL问题
- Windows Mobile 常见问题解答
- Windows Azure 常见问题解答
- Windows 10常见问题解答
- windows 中常见问题解答
- JNA实现Java调用C++动态链接库
- JNA调用C语言动态链接库学习实践总结
- 兼容的“Microsoft.AspNet.Razor.zh-Hans”版本
- C#从视频截图的方法
- UITabBar
- C++ 之 原子操作 Interlocked系列函数多线程(四)
- JAVA进行类型转换
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- C/C++代码(1):队列
- C/C++ via Windows (1) - first thing first
- ios 之contentmode
- linux设备模型之i2c子系统
- office2003word解除安全模式启动
- 错误: 找不到与“EntityFramework 6.0.2-beta1”兼容的“EntityFramework.zh-Hans”版本。
- 百度推广——搜索营销新视角
- iOS学习笔记: 错误记录