把C/C++代码嵌入到java中(转)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 把C/C++代码嵌入到java中(转)

把C/C++代码嵌入到java中(转)

 2011/11/21 7:56:10  zhangfeilo  http://zfei.iteye.com  我要评论(0)
  • 摘要:JavaNativeInterface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。l标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的l你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的l程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们1.编写HelloWorld程序
  • 标签:c++ Java 代码

Java Native Interface(JNI)Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。

l???标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的

l???你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的

l???程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

?

1.编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。编写java代码,我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示?
class HelloWorld {?
public native void displayHelloWorld();?
static {?
System.loadLibrary("hello");?
}?

public static void main(String[] args) {?
new HelloWorld().displayHelloWorld();?
}?
}?
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so
?
2
。编译java代码
?
javac HelloWorld.java?
生成HelloWorld.class文件
?
3
。创建.h文件
?
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
?
javah HelloWorld
。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
?
在此我们不对他进行太多的解释。
?
/* DO NOT EDIT THIS FILE - it is machine generated */?
#include <jni.h>?
/* Header for class HelloWorld */?
#ifndef _Included_HelloWorld?
#define _Included_HelloWorld?
#ifdef __cplusplus?
extern "C" {?
#endif?
/*?
* Class: HelloWorld?
* Method: displayHelloWorld?
* Signature: ()V?
*/?
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld?
(JNIEnv *, jobject);?
#ifdef __cplusplus?
}?
#endif?
#endif?
4
?编写本地实现代码
?
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
?
#include <jni.h>?
#include "HelloWorld.h"?
#include <stdio.h>?

JNIEXPORT void JNICALL?
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)?
{?
printf("Hello world!\n");?
return;?
}?
注意我们这里include?jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.hJAVA_HOME/include里面。编译通过后再生成hello.dll文件。
?
5
?运行java程序
?
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.javaHelloWorld.classhello.dll文件。运行java HelloWorld命令,则可在控制台看到
Hello world|?
的输出了。

?

?

?

Linux下测试jni
1
、在测试用户下建立srclib目录

2
、进入src目录编写HelloWorld.java
class HelloWorld {
/* Native method declaration */
public native void displayHelloWorld();
??? /* Use static intializer */
?? static {
?? ?? System.loadLibrary("hello");
?? }
?? /* Main function calls native method*/
?? public static void main(String[] args) {
?? ??? new HelloWorld().displayHelloWorld();
?? }
}
3
、然后
javac HelloWorld.java
4
、使用?javah?工具生成?HelloWorld.h?文件

javah HelloWorld
5
、编写HelloWorld.c
#include <jni.h>;
#include "HelloWorld.h"
#include <stdio.h>;

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
?? printf("Hello world!\n");
?? return;
}
6
、编译c的动态库

gcc -shared -o $HOME/lib/libhello.so HelloWorld.c
注意$HOME/lib目录要加入到环境变量LD_LIBRARY_PATH中去
7
java HelloWorld运行程序

?

jni 关于dll文件的生成以及找不到jni.h的解决办法

?

首先是关于dll文件的生成: 方法如下: 打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library在向导中选择空工程添加如用javah生成的头文件和自己写的一个cpp文件,然后编译运行,如果没有出现错误,既可以在编译成功的 debug文件夹中找到dll文件,如果出现找不到jni.h的错误,那么用如下方法解决: fatal error C1083: Cannot open include file: 'jni.h': No such file or directory 将以下文件: \jdk\include\jni.h \jdk\include\win32\jawt_md.h \jdk\include\win32\jni_md.h 复制到Visual Studio.net的安装目录下的\Vc7\include目录中如果是VC6.0,自己找相应的目录即可!

?

发表评论
用户名: 匿名