最近在公司里做了一个手机的项目,需要java程序在发送短信的时候与第三方的短信服务器连接。短信接口是用c++写的。琢磨了三天,大致搞懂了jni的主体部分。先将心得整理,希望各位朋友少走弯路。
【相关文章:JDBC连接数据库之十大技巧】 【扩展阅读:全面接触存储路由器】首先引用一篇文章,介绍一个简单的jni的调用的过程。 【扩展信息:iSCSI技术应用详解】 java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它与本地机器的各种内部联系变得很少,约束了它的功能。解决java对本地操作的一种方法就是jni。 java通过jni调用本地方法,而本地方法是以库文件的形式存放的(在windows平台上是dll文件形式,在unix机器上是so文件形式)。通过调用本地的库文件的内部方法,使java可以实现与本地机器的紧密联系,调用系统级的各接口方法。 简单介绍及应用如下: 一、java中所需要做的工作 在java程序中,首先需要在类中声明所调用的库名称,如下: static { system.loadlibrary(“goodluck”); } 在这里,库的扩展名字可以不用写出来,究竟是dll还是so,由系统自己判断。 还需对将要调用的方法做本地声明,关键字为native。且只需要声明,而不需要具体实现。如下: public native static void set(int i); public native static int get(); 然后编译该java程序文件,生成class,再用javah命令,jni就会生成c/c++的头文件。 例如程序testdll.java,内容为: public class testdll { static { system.loadlibrary("goodluck"); } public native static int get(); public native static void set(int i); public static void main(string[] args) { testdll test = new testdll(); test.set(10); system.out.println(test.get()); } }用javac testdll.java编译它,会生成testdll.class。 再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被c/c++程序调用来生成所需的库文件。 二、c/c++中所需要做的工作 对于已生成的.h头文件,c/c++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到java程序的路径下面,就可以用java调用c/c++所实现的功能了。 接上例子。我们先看一下testdll.h文件的内容: /* do not edit this file - it is machine generated */ #include /* header for class testdll */ #ifndef _included_testdll ... 下一页