热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jni学习1

JNI是JavaNativeInterface的缩写,中文为JAVA本地调用。从Java1.1开始,JavaNativeInterface(JNI)标准
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

java平台




1.为什么要使用jni 



a.运行效率:
java属于解释型语言,源码被编译成二进制伪代码,由JAVA虚拟机解释执行。C是编译型的,直接将源码编译成机器代码.有些应用可能对性能有更高的要求,可能需要使用c/C++来完成,jni为不同语言的相互调用提供了一个桥梁。


b.硬件驱动访问:
java 属于高级语言,不能直接对硬件进行访问。有些场合需要访问特定的硬件信息,这时候就需要调用其它语言来完成。


c.已有功能的利用
系统的某些功能已经非常成熟、稳定。其他功能由java语言开发,如果需要集成那些功能,没有必须重新用java重新开发,可以采取jni方式来实现,达到功能模块的重复使用。


java刚刚推出的时候,一个很响亮的口号“一次编译,到处运行”。jni会使应用丧失跨平台的特性,天下木有免费的午餐,要得到什么,就有用什么去交换。


jni实现:


1. 编写java文件,声明native方法和 静态 SystemloadLibrary(String libname) 代码块,生成.class 文件
2. javah 编译 生成的.class 文件,生成.h头文件 (如果特别熟悉jni,可以自己编写对应的.h文件)
3. 根据.h文件,编写对应的c/c++文件,实现对应的方法。
4. 编译对应的c/c++文件,生成dll/so文件
5. 将生成dll/so文件放到程序的根目录或者系统的目录下面,执行.class文件,查看运行效果 

1. package demo.jni1;


public class Print
{
static 
{
System.loadLibrary("hello");
}

public native void print ();  
}


2. 找到程序对应的目录,执行javah 命令,生成.h文件
javah -jni demo.jni1.Print


生成的 demo_jni1_Print.h


/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class demo_jni1_Print */


#ifndef _Included_demo_jni1_Print
#define _Included_demo_jni1_Print
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     demo_jni1_Print
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_demo_jni1_Print_print
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif


3. 实现对应的hello.c方法,实例只是简单打印了一句话。


/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class demo_jni1_Print */


#ifndef _Included_demo_jni1_Print
#define _Included_demo_jni1_Print
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     demo_jni1_Print
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_demo_jni1_Print_print
  (JNIEnv *, jobject)
{
printf("hello world!\n");
}


#ifdef __cplusplus
}
#endif
#endif 

4. 因为在win32平台下用vc6.0编译,所以生成的是hello.dll 文件

5. 将hello.dll复制到程序的根目录下面,运行程序。 




注:
编译dll可能会遇到的问题?
1.提示找不到jni.h文件?
因为vc6库中并没有这个文件,所以才会出错。
jni.h在jdk1.6.0_30\include下面,将jni.h复制到vc
对应的Microsoft Visual Studio\VC98\Include目录下
2.提示找不到jni_md.h文件?
原因和上面一样。jni_md.h在jdk1.6.0_30\include\win32目录下面
,将jni_md.h复制到Microsoft Visual Studio\VC98\Include目录下

,重新编译程序。


vc6使用 
1.选择新建工程


2.新建文件



推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
author-avatar
天天写程序
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有