JNI完全手册

2016-01-29 12:50 4 1 收藏

JNI完全手册,JNI完全手册

【 tulaoshi.com - Java 】

  最近在公司里做了一个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用C++写的。琢磨了三天,大致搞懂了JNI的主体部分。先将心得整理,希望各位朋友少走弯路。
  首先引用一篇文章,介绍一个简单的JNI的调用的过程。
  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
  #define _Included_testdll
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class: testdll
  * Method: get
  * Signature: ()I
  */
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
  /*
  * Class: testdll
  * Method: set
  * Signature: (I)V
  */
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  #ifdef __cplusplus
  }
  #endif
  #endif
  在具体实现的时候,我们只关心两个函数原型
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
  好,下面我们用testdll.cpp文件具体实现这两个函数:
  #include "testdll.h"
  int i = 0;
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
  {
  return i;
  }
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
  {
  i = j;
  }
  编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
  我的项目比较复杂,需要调用动态链接库,这样在JNI传送参数到C程序时,需要对参数进行处理转换。才可以被C程序识别。
  大体程序如下:
  public class SendSMS {
  static
  {
  System.out.println(System.getProperty("java.library.path"));
  System.loadLibrary("sms");

来源:http://www.tulaoshi.com/n/20160129/1487766.html

延伸阅读
标签: autocad教程
关于圆周阵列的几点技巧 2001下做圆周阵列是通过驱动角度尺寸来阵列的,但往往很多人在阵列是找不到角度尺寸!(注:WF2已经加入了轴阵列,只要指定阵列的参照轴即可,无需驱动角度尺寸了) 这里给出几种解决的方法: 第一种,如果用打孔的方法则选用直径 第二种,在2D绘制截面时人为的做一个角度驱动尺寸 第三种,利用copy-move-rotat...
《过山车大亨》完全工作手册 望不尽的队伍、糟糕的食物和令人咋舌的票价如果您去过游乐场,那么这些您一定经历过。如果您曾有过如果我是这个游乐场的老板的话一定会作的更好之类的遐想的话,那么现在您的机会来了《过山车大亨》在等着您!您的挑战从一小笔经费和一块土地开始,而目标就是建造出一个令您的游客流连忘返的游乐场。 正如名字...
/* 豆腐制作,都是精品 http://www.asp888.net 豆腐技术站 如转载 请注明出处 */ asp+发送Email 完全手册,本文包含我们发送Mail的所有常见的例子,当然,限于篇幅,我们只是 简单的举例子,如果大家有什么意见的话,欢迎到 http://www.asp888.net/bbs 讨论 1.用asp+发送简单的Mail <% @Page Language="C#" % <% @Import Namespace="Syste...
标签: autocad教程
就主要是针对初学者,其实proe的阵列功能十分强大,熟练的掌握它不仅能提高你的效率,还能用它来生成一些特殊的实体!好了,不说了,开始吧! 首先还是介绍一下阵列吧: 关于阵列特征 在创建阵列时,通过改变某些指定尺寸,可创建选定特征的实例。选定用于阵列的特征称为阵列导引。 阵列有如下优点: 创建阵列是重新生成特征的快捷方式。 ...
标签: autocad教程
第二种:表阵列 关于表阵列 可用阵列表来阵列特征。 通过一个可编辑表,为阵列的每个实例指定唯一的尺寸,可使用阵列表创建特征或组的复杂或不规则阵列。 可为一个阵列建立多个表,这样通过变换阵列的驱动表,可改变阵列。 在创建阵列之后,可随时修改阵列表。隐含或删除表驱动阵列的同时也将隐含或删除该阵列导引。 在“组件”模式中...

经验教程

214

收藏

99

精华推荐

热靴闪光灯完全指导手册

热靴闪光灯完全指导手册

兔b男勃丸丶m

全面了解制作滚动字幕完全手册

全面了解制作滚动字幕完全手册

东京热啊热啊热

《骑马与砍杀》弓骑兵完全手册

《骑马与砍杀》弓骑兵完全手册

蜜马8888

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部