- 浏览: 812962 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
第一个Helloworld例子:
注意:把dll 文件放在Path下面之后 需要重新启动eclipse,因为eclipse 会在加载的时候去读Path,之后你修改了Path,eclipse 不会重新读。
使用JNI 的两个弊端:
一个java掉C++代码查看cpu 使用情况的例子,完全按照上述的步骤:
1.首先声明navtive 方法
package cn.com.xinli; public class JNIDemo { public native void sayHello(); public static void main(String[] args) { } }
2. 时候javah 命令生成头文件,到class 目录下 javah cn.com.xinli.JNIDemo
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class cn_com_xinli_JNIDemo */ #ifndef _Included_cn_com_xinli_JNIDemo #define _Included_cn_com_xinli_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: cn_com_xinli_JNIDemo * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_cn_com_xinli_JNIDemo_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
3.编写vc++源文件 也就是实现 Java_cn_com_xinli_JNIDemo_sayHello ,具体实现 是我在晚上拷贝的 打印cpu
的利用率,这里需要引入 3个头文件 一个是jni.h 在 (C:\Java\jdk1.5.0_07\include) 第2个是在 jni_md.h (C:\Java\jdk1.5.0_07\include\win32) 还有一个就是我们使用 javah 生成头文件
#include "cn_com_xinli_JNIDemo.h" #include <iostream> #include <windows.h> #include <conio.h> #include <stdio.h> using namespace std; #define SystemBasicInformation 0 #define SystemPerformanceInformation 2 #define SystemTimeInformation 3 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) typedef struct { DWORD dwUnknown1; ULONG uKeMaximumIncrement; ULONG uPageSize; ULONG uMmNumberOfPhysicalPages; ULONG uMmLowestPhysicalPage; ULONG uMmHighestPhysicalPage; ULONG uAllocationGranularity; PVOID pLowestUserAddress; PVOID pMmHighestUserAddress; ULONG uKeActiveProcessors; BYTE bKeNumberProcessors; BYTE bUnknown2; WORD wUnknown3; } SYSTEM_BASIC_INFORMATION; typedef struct { LARGE_INTEGER liIdleTime; DWORD dwSpare[76]; } SYSTEM_PERFORMANCE_INFORMATION; typedef struct { LARGE_INTEGER liKeBootTime; LARGE_INTEGER liKeSystemTime; LARGE_INTEGER liExpTimeZoneBias; ULONG uCurrentTimeZoneId; DWORD dwReserved; } SYSTEM_TIME_INFORMATION; typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG); PROCNTQSI NtQuerySystemInformation; JNIEXPORT void JNICALL Java_cn_com_xinli_JNIDemo_sayHello (JNIEnv * env, jobject obj) { SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo; SYSTEM_TIME_INFORMATION SysTimeInfo; SYSTEM_BASIC_INFORMATION SysBaseInfo; double dbIdleTime; double dbSystemTime; LONG status; LARGE_INTEGER liOldIdleTime = {0,0}; LARGE_INTEGER liOldSystemTime = {0,0}; NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation"); if (!NtQuerySystemInformation) return; // get number of processors in the system status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL); if (status != NO_ERROR) return; cout<<"\nCPU Usage: "<<endl; while(!_kbhit()) { // get new system time status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); if (status!=NO_ERROR) return; // get new CPU's idle time status =NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL); if (status != NO_ERROR) return; // if it's a first call - skip it if (liOldIdleTime.QuadPart != 0) { // CurrentValue = NewValue - OldValue dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); // CurrentCpuIdle = IdleTime / SystemTime dbIdleTime = dbIdleTime / dbSystemTime; // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5; //printf("\b\b\b\b%3d%%",(UINT)dbIdleTime); cout<<(UINT)dbIdleTime<<endl; } // store new CPU's idle and system time liOldIdleTime = SysPerfInfo.liIdleTime; liOldSystemTime = SysTimeInfo.liKeSystemTime; // wait one second Sleep(1000); } //printf("\n"); cout<<"\n"<<endl; }
在吧 .cpp 文件 编译成动态链接库 的时候我使用了 Microsoft Visual C++ 6.0 ,这个东东好的大呀,真是心疼我的机器呀,整个项目的 结构如下图
然后需要我们将 .cpp的源文件 编译成dll
a. 在 工程-》设置 下面的 对象/库模块 下加上 ws2_32.lib
b. 输出加上 test.dll
编译,后在 D:\Program Files\Microsoft Visual Studio\MyProjects\test\Release 看到 test.dll
4. 写java 端调用代码
package cn.com.xinli; import java.util.Date; public class JNIDemo { public native void sayHello(); /** * @param args */ static { System.loadLibrary("test"); } public int property; public int function(int foo,Date date,int[] arr) { System.out.println("function"); return 0; } public static void main(String[] args) { System.out.println("系统Path路径:"+System.getProperty("java.library.path")); JNIDemo jNIDemo=new JNIDemo(); jNIDemo.sayHello(); } }
需要我们把 test.dll 放在打印出的path 路径下
运行成功!!!
- jnitest.rar (79.3 KB)
- 下载次数: 32
发表评论
-
eclipse link 方式管理插件
2012-02-24 15:55 1555以配置tomcat插件为例: (条件:F:\eclip ... -
使用mapinfo 开发GIS 应用
2011-03-18 06:56 12981. mapJ 对象是在tomcat启动的时候 从web ... -
java mail adapter
2011-01-21 12:23 15322011.04.27: 使用jmail 发送中文标题的 ... -
4种调用https服务的方式
2011-01-05 23:45 8791以前在网厅的时候,请求计费的账单开 ... -
正则表达式30分钟入门教程
2010-11-17 12:58 1477正则表达式30分钟入门教程 -
java 异常层次
2010-05-26 16:14 1339Java 中的异常类,包括内置的异常类以及自定义的异常类,都直 ... -
java 解惑你知多少 (转载)
2010-04-26 12:43 1203(1) http://jiangzhengjun.it ... -
jvm调优
2010-04-16 15:35 1286(1) http://pengjiaheng.itey ... -
谈谈重构
2010-04-15 13:34 1317代码重构阅读心得[转] http://www.cnblogs ... -
session会话跟踪的一个小例子
2010-03-14 18:16 1869内容包括: 必备知识: ... -
cookie机制和session机制的区别
2010-03-14 17:06 1200一、cookie机制和sessio ... -
Cookie详解
2010-03-14 16:02 1399Cookie在英文中是小甜品 ... -
什么是Cookie?
2010-03-14 15:06 1452按照Netscape官方文档中 ... -
任务、进程和线程的区别(转)
2010-02-04 17:16 2284任务(task)是最抽象 ... -
加密,解密,认证,数字签名,公钥私钥
2010-01-13 20:42 2333Bob,Alice和数字证书 网络安全中最知名的 ... -
JSON在处理hibernate中的cascade对象时的解决方案
2009-12-24 22:12 1526如果数据间存在级联关系,在hibernate中极容易嵌套而 ... -
digester框架 将 XML->JavaBean
2009-11-08 17:38 1755digester组件简化了xml文 ... -
什么是P问题、NP问题和NPC问题
2009-10-25 20:20 2054什么是P问题、NP问题和NPC问题 出自mat ... -
用Fat Jar Eclipse Plug-In打包可执行jar文件
2009-09-30 08:29 3963Fat Jar Eclipse Plug-In [FJEP] ... -
使用jxl操作excle文件
2009-09-14 08:20 1941有个需求 1. ...
相关推荐
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...
JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android系统中,JNI被广泛应用于实现性能敏感的代码,例如与硬件直接交互、调用C/C++库或者利用已有的C/C++...
3. **JNI常量**:定义了一些预定义的常量,如`JNI_VERSION_1_1`, `JNI_VERSION_1_2`, `JNI_VERSION_1_4`, `JNI_VERSION_1_6`, `JNI_VERSION_1_8`等,用于表示JNI接口的版本。 4. **JNI环境变量**:`JNIEnv`结构体中...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C/C++库或者优化性能时。本篇文章将深入探讨如何在JNI中传递...
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,比如优化性能、利用已有的C/C++库或者访问操作系统特定的功能。在这个"Java jni调用...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者为了性能优化而需要直接调用硬件接口时。在这...
在Android开发中,Java Native Interface (JNI) 是一个关键的工具,它允许Java代码与本地C/C++代码交互。JNI的使用场景广泛,包括优化性能、利用硬件特性、调用已有的C/C++库等。当涉及到Android调用JNI并返回自定义...
JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...
上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...
在Android系统中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。本资源"I2CJNI.rar"似乎包含了一个实际应用的Android I2C通信示例,利用JNI来实现硬件级别的低层通信。I2C...
JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常被用来提高性能、调用系统底层库或实现特定功能,例如本例中的操作Java的list集合。在...
在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...
在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者实现与硬件设备的直接通信。在...