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



推荐阅读
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 本文详细探讨了在Windows 98环境下安装Apache 1.3.9、JServ、GNUJSP 1.0、JDK 1.2.2及JSDK 2.0后遇到的中文显示问题,并提供了多种有效的解决方案。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
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社区 版权所有