`
SevenRedCity
  • 浏览: 62316 次
  • 性别: 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++程序的方法中呢

相关推荐

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    JNA 是一个Java库,它允许Java应用程序直接访问本地库中的函数和数据,而无需编写JNI代码或重新编译任何代码。JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理类型转换。 2. ...

    java调用C/C++全过程

    为了弥补这一缺陷,Java引入了JNI(Java Native Interface)技术,允许Java代码直接调用本地C/C++代码,从而实现更深层次的操作系统访问和性能优化。 #### 二、Java调用C/C++的基础概念 在讨论具体过程之前,我们...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    总结来说,这个入门项目教你如何设置一个基本的Android NDK环境,创建Java和C/C++之间的交互,并最终生成一个可以在Android设备上使用的本地库。通过这种方式,开发者可以充分利用C/C++的性能优势,同时保持Java的...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI在许多场景下非常有用,比如当需要调用已有的C/C++库、提升性能或者利用硬件特性时。本教程将详细介绍如何...

    java调用C/C++过程

    Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。对于那些需要利用C或C++的高性能特性的Java开发者来说,JNI是一个重要的工具。...

    jni.zip_c调用java_java 调用 c++_安卓 JNI

    在Android平台上,JNI(Java Native Interface)是一种关键的技术,它允许Java代码与本地(C/C++)代码进行交互。JNI是Java平台标准的一部分,旨在提供一个安全、高效的方式来调用和被调用,使得开发者可以利用C/C++...

    C++转Java工具

    在JNI开发中,通常会编写Java代码来定义本地方法,然后使用JNI头文件生成对应的C/C++代码,编译后与Java字节码一起运行。 C++转Java工具的工作原理可能包括语法解析、类型映射和代码重构等步骤。它会读取C++源代码...

    java写的一个使用jni调用c/c++的dll

    首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码中,而是由本地代码(如C/C++)提供。Java虚拟机(JVM)会加载这些本地...

    使用Java Native Interface调用本地C++代码.txt

    Java Native Interface (JNI) 提供了一种机制,使得Java程序能够调用本地代码(如C/C++),从而利用这两种语言的优势:Java提供强大的跨平台能力和丰富的库支持,而C/C++则擅长处理性能敏感的任务或与操作系统紧密...

    android调用C/C++

    在Android平台上,调用C或C++代码是通过Java Native Interface (JNI) 实现的,这是一种允许Java代码与本地库交互的技术。JNI已经成为Android开发者在性能关键领域,如图形处理、游戏引擎、加密算法等中引入C/C++代码...

    在 C/C++ 中调用 Java

    在C/C++中调用Java代码,主要依赖于Java Native Interface (JNI),这是一个允许Java代码与本地代码交互的标准接口。JNI使得开发者可以将C/C++的高性能代码集成到Java应用程序中,或者从C/C++程序中调用Java的类和...

    JNI 教程 java与c/c++互相调用

    - **本地方法接口**:Java代码通过`System.loadLibrary()`加载动态链接库(DLL或SO),然后通过`native`方法调用C/C++函数。 - **JNI函数注册**:C/C++代码需要使用`RegisterNatives()`函数注册Java类中的本地方法...

    java调用c c++程序实例

    JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/C++实现的函数。 在Java中,你需要定义一个native方法,这是通过在方法...

    C++库封装JNI接口-实现java调用c++

    JNI是一套接口,它定义了Java虚拟机(JVM)如何与本地代码(如C++)通信。Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建...

    java jni c++代码

    1. **本地方法**: 由C或C++编写,被Java代码调用的函数。 2. **JNI头文件**: 提供了JNI函数的声明,用于在C/C++代码中实现Java调用。 3. **JNI函数**: 例如`FindClass`, `GetMethodID`, `NewObject`等,用于在C/C++...

    java访问本地

    Java访问本地,通常指的是Java平台如何通过JNI(Java Native Interface)与本地系统代码进行交互,以便利用C/C++等本地语言的功能。JNI是Java提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互,特别是...

    java调用C和C++

    5. **加载动态链接库**:在Java代码中加载动态链接库,使Java运行时能够访问这些本地方法。 #### 四、实例演示 下面通过一个具体的例子来展示如何使用JNI来调用C/C++函数。 假设我们有一个Java类`TestDll`,其中...

    android调用c和c++源代码

    JNI是Android系统提供的一种机制,它允许Java代码调用本地(即C/C++)代码,并且本地代码也可以调用Java方法。JNI接口包括头文件和库文件,开发者需要编写相应的JNI函数并在Java代码中声明对应的native方法。 在...

    java与C++的相互调用

    JNI(Java Native Interface)是Java平台标准的一部分,它提供了一种机制,使得Java代码能够调用C/C++函数,同时C/C++代码也能调用Java的方法。在Android开发中,JNI和NDK(Native Development Kit)的结合使用尤其...

    Android-JNI完整工程,实现c++调用java和java调用c++

    - JNI接口提供了Java虚拟机(JVM)和本地代码之间的桥梁,使得开发者可以使用Java调用C/C++函数,反之亦然。 - JNI头文件(`jni.h`)包含了定义了JNI函数和数据类型的声明,是编写JNI代码的基础。 2. **创建JNI...

Global site tag (gtag.js) - Google Analytics