`
8366
  • 浏览: 812962 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JNI

阅读更多

 

 

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 路径下

 

运行成功!!!

 

 

分享到:
评论

相关推荐

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...

    DELPHI开发JNI必备 jni.pas

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...

    JNI的两个头文件jni.h和jni_md.h

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...

    jni和jniLibs的压缩包.rar

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android系统中,JNI被广泛应用于实现性能敏感的代码,例如与硬件直接交互、调用C/C++库或者利用已有的C/C++...

    jni.h头文件

    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传递对象数组

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C/C++库或者优化性能时。本篇文章将深入探讨如何在JNI中传递...

    Android通过JNI调用.so动态库

    Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...

    Java jni调用c实例

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,比如优化性能、利用已有的C/C++库或者访问操作系统特定的功能。在这个"Java jni调用...

    jni.h文件.7z

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者为了性能优化而需要直接调用硬件接口时。在这...

    Android调用Jni返回自定义对象

    在Android开发中,Java Native Interface (JNI) 是一个关键的工具,它允许Java代码与本地C/C++代码交互。JNI的使用场景广泛,包括优化性能、利用硬件特性、调用已有的C/C++库等。当涉及到Android调用JNI并返回自定义...

    JNI入门Demo3.0

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门...

    jni中用多线程调用java代码

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...

    CTP的JNI封装

    上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...

    I2CJNI.rar_Android jni_android_android i2c_android i2c通信 JNI_i2c

    在Android系统中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。本资源"I2CJNI.rar"似乎包含了一个实际应用的Android I2C通信示例,利用JNI来实现硬件级别的低层通信。I2C...

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    jni操作list集合,来存储对象

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常被用来提高性能、调用系统底层库或实现特定功能,例如本例中的操作Java的list集合。在...

    android通过JNI访问硬件LED

    在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    JNI处理hashmap,string等对象的操作

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者实现与硬件设备的直接通信。在...

Global site tag (gtag.js) - Google Analytics