浏览 4080 次
锁定老帖子 主题:Java代码访问本地代码C/C++
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-21
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程序的时候,尽量少用本地代码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-08-15
如果我要用dll文件中的一个方法,而不知道实现过程,请问一下,如何在JAVA中把参数传到C++程序的方法中呢
|
|
返回顶楼 | |