怎样在JAVA里嵌入C/C++代码
来源:互联网 发布:初级数据分析师内容 编辑:程序博客网 时间:2024/04/29 09:26
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.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
5。 运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
的输出了。
Linux下测试jni
1、在测试用户下建立src、lib目录
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运行程序
- 怎样在JAVA里嵌入C/C++代码
- 在c代码中嵌入汇编
- 如何在C里嵌入java虚拟机 编译和运行问题
- C语言怎样嵌入汇编
- SystemTap----嵌入C代码
- 在c程序中嵌入汇编代码的例子
- adnroid中嵌入C代码
- 在Symbian应用里嵌入汇编代码
- Form嵌入到Panel里(C#)
- 把php嵌入到c/c++里
- 在C中嵌入perl
- c与cpp的相互混合应用(c嵌入到cpp里或者cpp嵌入到c里) extern c和_cplusplus(一般在c库里合用)的来历
- 怎样调试部署在emulator上的c代码?
- 怎样调试部署在emulator上的c代码?
- 如何在C或C++代码中嵌入ARM汇编代码
- 如何在C或C++代码中嵌入ARM汇编代码
- C语言中嵌入汇编代码
- 怎样注释C/C++代码
- 内存受限设备的应用层内存管理(一)
- Struts Message Resources
- Debian的gnome字体显示问题
- utorrent flags meaning
- 程序员的成长从开窍开始
- 怎样在JAVA里嵌入C/C++代码
- 一位软件设计师对程序员的忠告
- .NET反射、委托技术与设计模式
- Spring JDBC
- 用winzar看就盘里的文件就会有'.vbs和autorun.inf(专杀)
- 检测本机所有的串并端口(vs2003调试通过)
- Linux/Unix/BSD
- spring
- Tomcat环境下配置oracle数据源的方法.