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文件夹里面去下载。
下面我们开始使用jna。第一个例子:
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]); } } }
hello world, argument 0: 1, argument 1: 2, argument 2: 3,
第二个例子:
上面那个例子使用了操作自带的动态链接库,现在我们再自己写一个动态链接库试试。
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< 它需要传入一个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语言输出的。
<>
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Windows Phone 7编程实践—推送通知(剖析推送通知实现架构)
Esri for Window Phone 7(一) 加载BingMap
浅谈ListBox在Windows Phone 7 中的使用
网友评论