- 浏览: 802146 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (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 1501以配置tomcat插件为例: (条件:F:\eclip ... -
使用mapinfo 开发GIS 应用
2011-03-18 06:56 12591. mapJ 对象是在tomcat启动的时候 从web ... -
java mail adapter
2011-01-21 12:23 15092011.04.27: 使用jmail 发送中文标题的 ... -
4种调用https服务的方式
2011-01-05 23:45 8732以前在网厅的时候,请求计费的账单开 ... -
正则表达式30分钟入门教程
2010-11-17 12:58 1448正则表达式30分钟入门教程 -
java 异常层次
2010-05-26 16:14 1311Java 中的异常类,包括内置的异常类以及自定义的异常类,都直 ... -
java 解惑你知多少 (转载)
2010-04-26 12:43 1172(1) http://jiangzhengjun.it ... -
jvm调优
2010-04-16 15:35 1253(1) http://pengjiaheng.itey ... -
谈谈重构
2010-04-15 13:34 1288代码重构阅读心得[转] http://www.cnblogs ... -
session会话跟踪的一个小例子
2010-03-14 18:16 1830内容包括: 必备知识: ... -
cookie机制和session机制的区别
2010-03-14 17:06 1171一、cookie机制和sessio ... -
Cookie详解
2010-03-14 16:02 1375Cookie在英文中是小甜品 ... -
什么是Cookie?
2010-03-14 15:06 1432按照Netscape官方文档中 ... -
任务、进程和线程的区别(转)
2010-02-04 17:16 2256任务(task)是最抽象 ... -
加密,解密,认证,数字签名,公钥私钥
2010-01-13 20:42 2296Bob,Alice和数字证书 网络安全中最知名的 ... -
JSON在处理hibernate中的cascade对象时的解决方案
2009-12-24 22:12 1499如果数据间存在级联关系,在hibernate中极容易嵌套而 ... -
digester框架 将 XML->JavaBean
2009-11-08 17:38 1728digester组件简化了xml文 ... -
什么是P问题、NP问题和NPC问题
2009-10-25 20:20 2020什么是P问题、NP问题和NPC问题 出自mat ... -
用Fat Jar Eclipse Plug-In打包可执行jar文件
2009-09-30 08:29 3928Fat Jar Eclipse Plug-In [FJEP] ... -
使用jxl操作excle文件
2009-09-14 08:20 1913有个需求 1. ...
相关推荐
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义
JNI程序员指南与规范.pdf + 06 JNI编程指南.pdf NDK开发汇总 https://blog.csdn.net/baopengjian/article/details/104615972 THIS book covers the Java™ Native Interface (JNI). It will be useful to you if ...
赠送jar包:zstd-jni-1.4.3-1.jar; 赠送原API文档:zstd-jni-1.4.3-1-javadoc.jar; 赠送源代码:zstd-jni-1.4.3-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-...
Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...
Jni应用详解 Jni(Java Native Interface)是一种allowing Java代码与 native 代码集成的技术,使得Java程序能够调用native方法和库。下面是Jni应用的详细解释: 一、Jni的主要作用 Jni的主要作用是让Java程序...
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符...
Java通过JNI(Java Native Interface)调用本地C/C++代码是一种常见的技术,它允许Java程序直接访问和利用原生库中的高效算法。然而,这种方式也带来了内存管理的复杂性,可能导致内存泄露,尤其是在处理深度学习等高...
META-INF/MANIFEST.MF com.ice.jni.registry.HexNumberFormat.class com.ice.jni.registry.NoSuchKeyException.class com.ice.jni.registry.NoSuchValueException.class com.ice.jni.registry.RegBinaryValue.class ...
本书介绍了JNI的设计思想,对这种思想的理解是使用JNI的各种特性的基础。 本书有一部分是JAVA2平台上面的JNI特征的规范说明。JNI程序员可以把这部分用作一个手册。JVM开发者在实现虚拟机的时候必须遵守这些规范。 ...
在Android开发中,SDK、NDK以及JNI是三个至关重要的组件,它们共同构成了Android平台上的原生代码开发环境。下面将详细阐述这三个概念及其在Android应用开发中的作用。 首先,Android SDK(Software Development ...
上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...
JNI 调用实例(Java、C++ 互相调用实例) 本文旨在介绍 Java 和 C++ 之间的互相调用实例,通过 JNI(Java Native Interface)技术,实现 Java 调用 C++ 和 C++ 调用 Java 的操作。下面将对标题、描述、标签和部分...
com.ice.jni.registry.RegMultiStringValue.class com.ice.jni.registry.RegBinaryValue.class com.ice.jni.registry.RegistryException.class com.ice.jni.registry.NoSuchValueException.class ...
从网上找的JNI编程指南,但是没有书签,为了方便自己看就添加了书签。JNI 是 JAVA 平台的一个重要特征, 使用它我们可以至用以前用 C/C++写的大量代码。本书 既是一个编程指南也是一个 JNI 手册。本书共包括三部分...
JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!
Android NDK jni 常用的API Android NDK 开发时需要的常用的 JNI API 可以分为以下几类: 获取版本信息 * `jint GetVersion(JNIEnv *env);`:获取 JNI 函数版本信息,返回值为 jint 类型,在 C/C++ 中 jint 为 32...
jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件jni.h文件
Java jni调用c实例
3. 在根目录下创建 jni 目录(mkdir jni). 4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 ...