热门标签 | 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.新建文件



推荐阅读
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • andr ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
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社区 版权所有