Java 中嵌入c/c++

分享到:

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

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

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

   程序的某些部分对速度要求比较苛刻,你选择用汇编或者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运行程序

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,自己找相应的目录即可!

昵    称:
验证码:

相关文档:

  • libjc - C语言事件驱动开发包
    libjc 是 C 语言的事件驱动开发框架。...
  • 通用LINUX C类库 jzlibs
    通用LINUX C类库。 包含双向链表、单向链表、向量、哈希表、红黑树等经典数据结构及其算法...
  • C/C++编译器 AsmJit
    C/C++编译器 AsmJit...
  • C语言的伪随机数发生器 gjrand
    gjrand 是一个C语言的伪随机数生成器。伪随机数的意思是在这个随机数并不保证是真正的随机,只适合一些对随机要求不是很高的场合,...
  • Linux C 的工具包:JustKit
    JustKit 是一个简单易于使用的 Linux C 的工具包...
  • C++ 异常堆栈跟踪器libcsdbg 的可视化工具:jTracer
    jTracer 是 libcsdbg 的可视化工具。当 libcsdbg 为异常、线程创建一个堆栈跟踪,可配置通过 TCP/IP 来广播跟踪的数据。而 jTracer 捕获这些数据...
  • GObjects 预处理器:GOB
    GObject Builder (GOB) 是一个用来轻松创建 GObjects (glib objects) 的简单预处理器。它读取 C 代码中的类描述文件并生成 .c 和 .h 的文件。可以让...
  • 纯Java 实现的 C 语言预处理器 - JCPP
    JCPP 是一个完整、兼容、独立的纯Java 实现的 C 语言预处理器,其目的是为了使用编写在 Java 中可使用的 C 风格编译器...
  • 多态在 Java 和 C++ 编程语言中的实现比较
    众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++...
  • C/C++学习工具 ZinjaI
    ZinjaI 是一个多平台的 C/C++ 集成开发环境,主要用在教室中学习 C/C++ 语言用的。...
  • 一个C/C++开发工具IDE - Anjuta
    Anjuta是一个C/C++ IDE,它最大的特色是灵活,同时打开多个文件,内嵌代码级的调试器(调用gdb),应用程序向导(Application widzards)可以方...
  • java嵌入c,c++程序指南
    本文为在 32 位 Windows 平台上实现 Java 本地方法提供了实用的 示例、步骤和准则。本文中的示例使用 Sun Microsystems 公司创建的 Java Developmen...
  • Node.js的C++移植版本 Node.native
    node.native 是 node.js 的一个 C++11 (aka C++0x) 的一个移植。...
  • 类似于Java Spring的C++依赖注入库:autumnframework
    Autumn Framework 项目是用C++实现依赖注入。它支持属性setter注入和构造器注入。它可以在多个平台上编译。它支持POCO(普通的C + +对象)并...
  • JSONCPP介绍及使用
    JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。 jsoncpp是c++解析JSON串常用的解析库之一。其...
  • C语言日志、事务API libjio
    libjio是一个C库做日志,交易为导向的I/O它提供了一个类UNIX的文件操作功能(如打开,读取和写入) ,这是装在一个交易框架,以使文件...
  • C++ 转换成 JSON
    经常有朋友问我如何将C++对象转换成JSON格式字符串。我的回答通常是CppCMS中的json::value. 我也写过一篇文章介绍该技术。...