c程序控制java端代码-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 114818
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 11:07
个人简介

弃我去者,昨日之日不可留; 乱我心者,今日之日多烦忧。

文章分类

(83)

  • (5)
  • (65)
  • (3)
  • (10)
  • (0)
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: java

2014-11-13 16:19:39

c程序控制java端代码
整个示例程序有 jnifuncmain类(包含本地方法声明)、jnitest对象和jnifunc.dll(包含本地方法的具体实现)三部分组成。在jnifuncmain类的本地方法中调用jnitest对象的方法和成员变量,具体由c 代码实现,包含在jnifunc.dll中。

1、 
编写java代码 jnifuncmain.java和jnitest.java
jnifuncmain.java

点击(此处)折叠或打开

  1. public class jnifuncmain
  2. {
  3.     private static int staticintfield = 300;
  4.     
  5.     //加载本地库jnifunc.dll
  6.     static { system.loadlibrary("jnifunc");}

  7.     //本地方法声明
  8.     public static native jnitest createjniobject();

  9.     public static void main(string[] args)
  10.     {
  11.         //从本地代码生成jnitest对象
  12.         system.out.println("[java] createjniobject()调用本地方法");
  13.         try{
  14.             jnitest jniobj = createjniobject();
  15.             
  16.             //调用jnitest对象的方法
  17.          jniobj.calltest();
  18.                 }catch(exception e)
  19.                 {
  20.                     system.out.println(e.getmessage());
  21.                 }
  22.         
  23.     }
  24. }
jnitest.java

点击(此处)折叠或打开

  1. class jnitest
  2. {
  3.     private int intfield;
  4.     
  5.     //构造方法
  6.         public jnitest(int num)
  7.         {
  8.             intfield = num;
  9.             system.out.println("[java}调用jnitest对象的构造方法:intfield = " intfield);
  10.         }
  11.     //此方法由jni本地函数调用
  12.     public int callbynative(int num)
  13.     {
  14.         system.out.println("[java] jnitest对象的callbynative(" num ")调用");
  15.         return num;
  16.     }


  17.     public void calltest()
  18.     {
  19.         system.out.println("[java] jnitest对象的calltest方法调用:intfield = " intfield);
  20.     }
  21. }

 2、  编译java代码

d:\users\lusi\jni\jni-2>  javac  jnifuncmain.java

3、  生成c语言需要包含的头文件jnifuncmain.h

d:\users\lusi\jni\jni-2>  javah  jnifuncmain

jnifuncmain.h

点击(此处)折叠或打开

  1. * do not edit this file - it is machine generated */
  2. #include <jni.h>
  3. /* header for class jnifuncmain */

  4. #ifndef _included_jnifuncmain
  5. #define _included_jnifuncmain
  6. #ifdef __cplusplus
  7. extern "c" {
  8. #endif
  9. /*
  10.  * class: jnifuncmain
  11.  * method: createjniobject
  12.  * signature: ()ljnitest;
  13.  */
  14. jniexport jobject jnicall java_jnifuncmain_createjniobject
  15.   (jnienv *, jclass);

  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

4、  编写c 代码 jnifunc.cpp


点击(此处)折叠或打开

  1. #include "jnifuncmain.h"
  2. #include <stdio.h>

  3. jniexport jobject jnicall java_jnifuncmain_createjniobject(jnienv * env, jclass clazz)
  4. {
  5.     jclass targetclass;
  6.     jmethodid mid;
  7.     jobject newobject;
  8.     jstring hellostr;
  9.     jfieldid fid;
  10.     jint staticintfield;
  11.     jint result;

  12. // c程序控制java端代码

  13.     //1、访问类静态成员域,获取jnifuncmain类的staticintfield变量值
  14.     fid = env->getstaticfieldid(clazz, "staticintfield", "i");
  15.     staticintfield = env->getstaticintfield(clazz, fid);
  16.     printf("[cpp]获取jnifuncmain类的staticintfield值\n");
  17.     
  18.     //查找生成对象的类
  19.     targetclass = env->findclass("jnitest");
  20. //该函数用于加载本地定义的类。它将搜索由classpath 环境变量为具有指定名
  21. //称的类所指定的目录和 zip 文件
  22. // findclass的参数名必须是:类全名(即包名后跟类名,之间由“/”分隔)
  23.     
  24.     //2、查找构造方法
  25.     mid = env->getmethodid(targetclass, "", "(i)v");
  26.         // 1."(i)v"是用javap反编译工具反编译jnitest的成员
  27.         // 获得的签名。getmethodid方法会根据此签名找到该方法。
  28.         // 反编译class文件命令,例子: javap -s -p 类名
  29.         // 2. 第一个参数不是jnienv*类型是因为此代码是c代码。原理类似于this指针。
  30.         // 3. 只有获得构造方法时第2个参数是<init>,其他的,直接传入方法名称即可。
  31.     //3、生成jnitest对象(返回对象的引用)
  32.     printf("[cpp]jnitest对象生成\n");
  33.     newobject = env->newobject(targetclass, mid, 100);
  34.     
  35.     //4、调用对象的方法
  36.     mid = env->getmethodid(targetclass, "callbynative", "(i)i");
  37.     result = env->callintmethod(newobject, mid, 200);
  38.     
  39.     //5、访问对象的成员变量,设置jniobject对象的intfield值
  40.     fid = env->getfieldid(targetclass, "intfield", "i");
  41.     printf("[cpp]设置jnitest对象的intfield值为200\n");
  42.     env->setintfield(newobject, fid, result);
  43.     
  44.     //返回对象的引用
  45.     return newobject;
  46. }

5、  生成c共享库

d:\users\lusi\jni\jni-2> cl  -i  "d:\program files\java\jdk1.8.0_25\include" -i  "d

\program files\java\jdk1.8.0_25\include\win32" –ld  jnifunc.cpp  -fejnifunc.dll

6、  执行java程序

d:\users\lusi\jni\jni-2> java  jnifuncmain


阅读(1376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图