`
SevenRedCity
  • 浏览: 61149 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java代码访问本地代码C/C++

    博客分类:
  • JNI
阅读更多
一、开篇
1、Java是跨平台的语言,但是在有些时候仍然是有需要调用本地代码(这些代码通常是由C/C++编写的)。

2、Sun公司提供的JNI是Java平台一个功能强大的接口。这个JNI接口提供了Java与操作系统本地代码互相调用的功能。

二、最简单的Java调用C/C++代码的步骤(Java通过调用C++本地代码在控制台输出HelloWorld)(使用IDE工具是Eclipse3和Visual Studio 2008)
1、首先在Java类中声明一个native的方法
操作:
-->使用Eclipse3新建名为Native工程
-->新建名为TestNative类并选择生成main方法
-->添加native方法public native void sayHello() ;

package org.jee ;

public class TestNative{

	public native void sayHello() ;

	public static void main(String[] args){
    }

}


留问题:C/C++是需要先声明的。而Java是通过使用JDK的bin目录的javah可执行文件,来生成对应的C/C++声明。

2、使用Javah命令生成包含native方法定义的C/C++头文件。
操作:
-->在命令行输入javah org.jee.TestNative(在classes或bin文件夹下输入并生成org_jee_TestNative.h文件)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_jee_TestNative */

#ifndef _Included_org_jee_TestNative
#define _Included_org_jee_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     org_jee_TestNative
* Method:    sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif


3、按照生成的C/C++头文件来写C/C++源文件
操作:
-->使用VS2008新建项目NativeCode(Win32控制台应用程序)
-->应用程序设置-->应用程序类型选择DLL(生成动态连接库)-->附加选项选择空项目
-->将org_jee_TestNative.h文件拷贝到该NativeCode下的NativeCode文件夹下
-->右击IDE左上角项目的头文件节点选择添加现有项并选择org_jee_TestNative.h
-->右击源文件节点添加新项选择C++文件(添加名为source类代码如下)
-->将Sun的JDK下的inlude文件下的jni.h和子文件夹win32下的jni_md.h两个头文件拷贝到NativeCode下子文件夹NativeCode下
(注意:#include "jni.h"是当jni.h文件不在系统环境变量时使用,而#include <jni.h>是当jni.h文件在系统环境变量下时使用)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class org_jee_TestNative */
#include"org_jee_TestNative.h"
#include<iostream>
using namespace std;

JNIEXPORT void JNICALL Java_org_jee_TestNative_sayHello (JNIEnv * env, jobject obj)
{
	cout<<"Hello World!"<<endl;
}


4、将C/C++源文件编译成动态连接库(DLL)
操作:
-->右击IDE左上角NativeCode工程选择生成(在NativeCode项目的子文件夹Debug下的NativeCode.dll文件)


5、DLL文件加入到PATH环境变量下
将DLL文件(NativeCode.dll)添加到环境变量Path中
操作:
-->右键我的电脑选择属性-->选择高级-->选择环境变量
-->在环境变量path后加入(动态连接库的路径).../NativeCode/Debug
(注意:每当设置环境变量时,必须重启IDE工具才能生效)


6、Java类中加载DLL,然后调用声明的native方法。(填写TestNative类的main方法)
public static void main(String[] args) {
	// TODO Auto-generated method stub
	// 加载动态连接库DLL,如果没有找到的话,则会在运行时报错
	System.loadLibrary("NativeCode");
	
	TestNative tnt = new TestNative();
		
	tnt.sayHello();
}


7、运行该项目正确结果会输出Hello World!

三、使用JNI的两个弊端
1、使用了JNI,那么这个Java Application将不能跨平台了。如果要移植到别的平台上,那么native代码就需要重新进行编写。

2、Java是强类型的语言,而C/C++不是。因此,你必须在使用JNI时更小心。

3、总之,必须在构建Java程序的时候,尽量少用本地代码。
分享到:
评论
1 楼 tasguocheng 2008-08-15  
如果我要用dll文件中的一个方法,而不知道实现过程,请问一下,如何在JAVA中把参数传到C++程序的方法中呢

相关推荐

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·指导读者用c++和c++/cli设计和创建大量的windows应用程序  ·为帮助读者掌握编程技巧,提供了大量可运行的示例和练习 作译者  Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,...

    Java本地接口工作方式初探

    Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JNative-1.4RC3.zip

    JNative 的目标是简化 Java 与本地代码之间的交互,并提供更加便捷的方式来访问底层系统功能或特定硬件的功能。它封装了 JNI 的复杂性,提供了更高层次的抽象和易用性。 使用 JNative,你可以定义本地方法的签名、...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java数据库连接方法和实现

     本地API驱动 这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。 类型3  网络协议驱动 这种类型的驱动给客户端提供了一个网络API,客户端上的...

    JNative_1.4RC2&1.4RC3&Jar;整合资源包

    这个库允许开发人员从Java访问本地库(DLL和LIB。so)。你不需要编译一行C/C++来使用它:它是动态的!现在,Win32 DLL和共享库可以与Java一起使用; JNative : Java to native interface Overview This library ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 301 11.3.2 公共子表达式消除 / 305 11.3.3 数组边界检查消除 / 307 11.3.4 方法内联 / 307 11.3.5 逃逸分析 / 309 11.4 Java与C/C++的编译器对比 / 311 11.5 本章小结 / 313 第五部分 高效并发 第12章 ...

    Visual C++ 2005入门经典--源代码及课后练习答案

     本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,...

    java开源包8

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包10

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    超赞的java基础入门教程

    如果需要间接调用这些底层功能的话,就需要使用JNI(Java本地接口)来调用本地代码,而间接访问意味着频繁调用这些特性时性能损失会很大,微软的.NET平台也有这样的问题。所以到目前为止,性能敏感的代码,例如驱动...

    《Android系统源代码情景分析》

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...

    java开源包11

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包6

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包9

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包4

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包101

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

Global site tag (gtag.js) - Google Analytics