>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28259 个阅读者 刷新本主题
 * 贴子主题:  JNI_Java Native Interface的用法 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-02-06 14:31:23     消息  查看  搜索  好友  邮件  复制  引用

          

一、简介

          Java Native Interface(JNI),java与c/c++交互的接口,下面是一个简单是示例。

          javah 可以生成native方法对应的头文件,javap 可以查看方法或者属性的签名。

二、示例

    1、书写带native的java代码                  

  1.       package com.jni;
  2.       import java.util.Date;
  3.       //javah com.jni.Hello
  4.       //com_jni_Hello.h
  5.       public   class  Hello {
  6.      public  int property;
  7.      //javap -s com.jni.Hello
  8.      //(ILjava/util/Date;[I)I
  9.        public  int  function ( int foo,Date date, int[] arr){
  10.      System.out.println(foo+ "="+date+ ""+arr);
  11.      return  0;
  12.      }
  13.        public  native  void  hello ();
  14.        public  static  void  main (String[] args) {
  15.      System.loadLibrary( "nativeCode");
  16.      Hello hl =  new Hello();
  17.      hl.hello();
  18.      }
  19.      }

      2、通过javah生成头文件com_jni_Hello.h                          

javah com.jni.Hello

      3、通过javap查看方法和属性签名                          

javap -s com.jni.Hello

      4、在vc或者vs中新建DLL工程(工程名为vativeCode),加入生成的头文件到工程中,如果有缺失的依赖头文件,到jdk目录(%java_home%\include)下找到,一起加入工程
    5、书写C/C++代码(.cpp文件中)                  

  1.       # include "com_jni_Hello.h"
  2.       # include <iostream>
  3.       using  namespace  std;
  4.       JNIEXPORT  void JNICALL  Java_com_jni_Hello_hello (JNIEnv * env, jobject obj)
  5.      {
  6.      cout<< "hello native"<< endl;  //
  7.      jclass hello_clazz = env->GetObjectClass(obj); //获取class
  8.      jfieldID field_prop = env -> GetFieldID(hello_clazz, "property", "I"); //通过属性名和签名获取属性
  9.      jmethodID methodId_func = env->GetMethodID(hello_clazz, "function", "(ILjava/util/Date;[I)I"); //获取方法
  10.      env->CallIntMethod(obj,methodId_func, 0L, NULL, NULL); //执行
  11.      }

      6、运行DLL工程生成dll文件(nativeCode.dll)配置dll文件到环境变量中

    7、运行java代码                  

  1.      hello native
  2.       0=nullnull

  ----------------------------
原文链接:https://blog.csdn.net/sand_ant/article/details/11742439

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-06 21:00:28 重新编辑]
  Java面向对象编程-->内部类
  JavaWeb开发-->多线程(下)
  JSP与Hibernate开发-->流程控制
  Java网络编程-->变量的作用域和初始化
  精通Spring-->面向对象开发方法概述之开发思想(上)
  Vue3开发-->JSP技术详解(Ⅱ)
  Java内存设置详解(含内存溢出问题的解决)
  Java Optional 解决空指针异常总结
  Java 语言中十大“坑爹”功能!
  使用策略模式优化代码实践,如何让项目快速起飞
  Eclipse和MyEclipse的区别
  小数在内存中是如何存储的?
  深入分析synchronized实现原理
  正则表达式性能调优
  Java入门实用代码:打印矩形
  Java 入门实用代码:数组扩容
  Java 入门实用代码:取最大和最小值
  Java入门实用代码:字符串小写转大写
  Java入门实用代码:查找字符串最后一次出现的位置
  中国有多少程序员?现在还值得学java吗?
  Java线程实现龟兔赛跑
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。