JAVA JNI原理详细介绍及简单实例代码

JAVA JNI原理

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:

实例:

环境说明:ubuntu 10.4.2 LTS系统

程序清单1:src/com/magc/jni/HelloWorld.java

 /**
  *
  */
  package com.magc.jni;

  /**
  * @author magc
  *
  */
 public class HelloWorld {

   static {

     System.loadLibrary("Hello");

   }

   public   native void DisplayHello();
   /**
   * @param args
   */
   public static void main(String[] args) {

     new HelloWorld().DisplayHello();
   }

 }

进入src目录下,编译该JAVA类,

命令:javac ./com/magc/jni/HelloWorld.java

在该HelloWorld.java所在目录下生成HelloWorld.class

然后使用javah生成头文件,

命令:javah -jni com.magc.jni.HelloWorld

在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数

程序清单2:com_magc_jni_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
  /* Header for class com_magc_jni_HelloWorld */

 #ifndef _Included_com_magc_jni_HelloWorld
 #define _Included_com_magc_jni_HelloWorld
 #ifdef __cplusplus
 extern "C" {
 #endif
 /*
 * Class:   com_magc_jni_HelloWorld
 * Method:  DisplayHello
 * Signature: ()V
 */
 JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
  (JNIEnv *, jobject);

 #ifdef __cplusplus
 }
 #endif
 #endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
     2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。

程序清单3:src/jni_helloworldImpl.cpp

#include <jni.h>
#include "com_magc_jni_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
  printf("From jni_helloworldImpl.cpp :");
  printf("Hello world ! \n");
  return;
}

此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。
编译生成动态库libHello.so,

命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so

成功后,便会在当前目录下生成动态链接库libHello.so文件。

有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法了,

命令:java -Djava.library.path=. com.magc.jni.HelloWorld

输入结果即为:From jni_helloworldImpl.cpp :Hello world !

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • JAVA JNI函数的注册过程详细介绍

    JAVA JNI函数的注册过程详细介绍 我们在java中调用Native code的时候,一般是通过JNI来实现的,我们只需要在java类中加载本地.so库文件,并声明native方法,然后在需要调用的地方调用即可,至于java中native方法的具体实现,全部交给了Native层.我们要在java中正确地调用到本地代码中对应函数的前提是什么呢?答案就是通过一定的机制建立java中native方法和本地代码中函数的一一对应关系,那么这种机制是什么呢?就是JNI函数的注册机制. JNI函数的注册有

  • Java进阶:JNI使用技巧点滴

    文章来源:csdn 作者:normalnotebook 摘要 本文为在 32 位 Windows 平台上实现 Java 本地方法提供了实用的示例.步骤和准则.本文中的示例使用 Sun Microsystems 公司创建的 Java Development Kit (JDK) 版本 1.4.1.用 C 语言编写的本地代码是用 Microsoft Visual C++ 编译器编译生成. 简介 近日,由于项目需要,要在WEB页面实现图像转换功能,而VC在图像转换方面有着得天独厚的优势.我们首先用VC封

  • JAVA中JNI的简单使用分享

    了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式.JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法. 步骤如下: 1.写好.java源文件: 复制代码 代码如下: packag

  • JNI实现最简单的JAVA调用C/C++代码

    JNI,是Java Native Interface的简称,中文是"Java本地调用".通过这种技术可以做到以下两点: Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数. Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java的函数. 本篇博客带给童鞋们以下内容,学习内容来自(传智播客),经由小巫总结整理: javah工具的用法 按照C/C++头文件来编写C/C++源文件 将C/C++源文件编译成动态

  • Java的JNI快速入门教程(推荐)

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究). 解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发. 2. JNI快速学习教程 2.1 问题: 使用JNI写一段代码,实现string_Java_Test_helloworld

  • 解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native code:在 native code 中嵌入 Java 虚拟机调用 Java 的代码. JNI 编程在软件开发中运用广泛,其优势可以归结为以下几点: 利用 native code 的平台相关性,在平台相关的编程中彰显优势. 对 native code 的代码重用. native code 底层操作

  • java jni调用c函数实例分享(java调用c函数)

    从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java.C/C++的桥梁--JNI.哈哈!分享一下! 一.简介JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序或者Java无法处理的任务无疑是一个很好的方式. 二.目的:Java代码中调用C/C++代码三.实现:假设我们的Java程序为J2C.java, C程序为J2C.c, Java与C之间的通信函数

  • JAVA JNI原理详细介绍及简单实例代码

    JAVA JNI原理 JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C.C++)的动态库进行交互,给其它语言发挥优势的机会. 有了JAVA标准平台的支持,使JNI模式更加易于实现和使用.在此总结了下面这个知识图: 实例: 环境说明:ubuntu 10.4.2 LTS系统 程序清单1:src/com/magc/jni/HelloWorld.java /** * */ package com.magc.jni;

  • Java RMI详细介绍及简单实例

    Java RMI详解 概要: Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方法调用的任何对象必须实现该远程接口. Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术. 大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi. 在大力鼓吹Web Service.SO

  • java BASE64Encoder详细介绍及简单实例

    java  BASE64Encoder详解 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码. Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3. 原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替.这就是为什

  • java  BASE64Encoder详细介绍及简单实例

    java  BASE64Encoder详解 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码. Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3. 原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替.这就是为什

  • Spring Annotaion Support详细介绍及简单实例

    最近正在看spring官网,看Spring IOC的时候看Spring容器扩展点的时候发现了BeanPostProcessor 这个接口.下面是官方对它的详细描述: BeanPostProcessor接口定义了回调方法,您可以实现提供自己的(或覆盖容器的默认)实例化逻辑,依赖性解析逻辑,等等.如果你想实现一些自定义逻辑Spring容器实例化完成后,配置和初始化一个bean,您可以插入一个或多个BeanPostProcessor实现. 您可以配置多个BeanPostProcessor实例,您可以控

  • PHP编程 SSO详细介绍及简单实例

    PHP SSO详解 SSO有三种模式:①跨子域单点登陆②完全跨单点域登陆③站群共享身份认证 第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可 第二种方式,也很简单,就是将所以应用的认证地址更换成同一个认证地址,每次查看是否在认证中心登陆,如果登陆了,给调用应用发放一个加密令牌即可 第三种跨域,就是来回跳转来回验证token略有麻烦 配置目录结构 在服务器根目录下,新建三个项目目录: |–/网站根目录/ |–|–/oa/ |–|–/bbs/ |–|–/blog/ 在根目录下新建f

  • Spring 自动代理创建器详细介绍及简单实例

    Spring 自动代理创建器 前言: 在经典的spring Aop中,可以手工为目标Bean创建代理Bean,配置文件必须为每一个需要增强的Bean声明一个代理,结果配置文件里声明了大量的代理Bean. 在经典的Spring Aop中,Spring提供了自动代理创建器(Aotu proxy creator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了. 接口Animal和Book:  package com.zzj.aop; public interfac

  • Android组件化原理详细介绍

    目录 什么是组件化? 为什么使用组件化? 一步步搭建组件化 1.新建模块 2.统一Gradle版本号 3.创建基础库 4.组件模式和集成模式转换 5.AndroidManifest的切换 6.*业务Application切换 组件之间的跳转 1.添加依赖 2.初始化ARouter 3.添加跳转 组件之间的数据传递 1.定义接口 2.实现接口 组件Application的动态切换 1.定义抽象类 BaseApplication 继承 Application 2.所有的组件的 Application

  • 用Java实现小球碰壁反弹的简单实例(算法十分简单)

    核心代码如下: if(addX){ x+=3; }else{ x-=3; } if(addY){ y+=6; }else{ y-=6; } if(x<=0||x>=(width-50)){ addX=!addX; } if(y<=0||y>=(height-50)){ addY=!addY; } 根据x和y递增的值,来决定角度. 以上这篇用Java实现小球碰壁反弹的简单实例(算法十分简单)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java web的读取Excel简单实例代码

    目录结构: Data.xls数据: 后台页面: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println(this.getServletContext().getRealPath ("/")); try{ Workbook wb = Workbook.getWorkbook(

随机推荐