`
zhangfeilo
  • 浏览: 400144 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

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

    博客分类:
  • 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,自己找相应的目录即可!

 

0
0
分享到:
评论

相关推荐

    MATLAB C/C++, Fortran, Java, and Python API Reference

    - 这是MATLAB与Python集成的一种方式,通常涉及使用MEX文件(MATLAB编译的C/C++代码)来创建Python模块。 - Python程序员可以通过这样的模块调用MATLAB计算,而无需直接启动MATLAB引擎。 在使用这些API时,开发者...

    java嵌入c,c++程序指南

    在C/C++代码中,你可以按照`MyNative.h`中定义的函数原型来实现具体的功能。例如: ```c #include "MyNative.h" JNIEXPORT void JNICALL Java_MyNative_HelloWorld(JNIEnv *env, jclass clazz) { // 实现...

    C/C++/Java/android/PHP/iOS/Python期末试卷.rar

    C/C++ 是两种常用的编程语言,它们在计算机科学中占有重要的地位。C 语言是一种底层、高效且灵活的语言,适用于系统编程、嵌入式开发以及编写操作系统等。C++ 是 C 语言的扩展,增加了面向对象编程(OOP)的概念,如...

    基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用

    2. **多语言集成**:通过特定的接口或者插件机制,服务器支持C、Python和Java代码的嵌入,这可能涉及到语言间的互操作性(如C++的绑定技术,如SWIG或Boost.Python)、进程间通信(IPC)或者异步调用。 3. **Web应用...

    Java programming with JNI

    通过JNI中的Invocation API,可以在本地应用程序中嵌入Java虚拟机 (JVM),从而使得程序员能够在本地代码中调用Java代码。 本教程将涵盖JNI最常见的两种应用场景:从Java程序调用C/C++代码以及从C/C++程序调用Java...

    android java native interface guide(jni指导 中文)

    - **集成C/C++库到Java项目**:介绍如何在Java项目中引入C/C++库,以提高性能或利用已有的C/C++代码。 - **在C/C++项目中嵌入Java VM**:讲解如何在C/C++项目中运行Java代码,这对于需要在非Java环境中使用Java的...

    matlab\MATLAB for C_C++ Programmers Webinar (May 2008).zip

    这使得 MATLAB 功能可以嵌入到 C/C++ 应用程序中,实现混合编程。 2. **MEX 文件**: MEX (MATLAB EXecutable) 文件是 MATLAB 和 C/C++ 之间的接口,允许 C/C++ 代码与 MATLAB 工作环境交互。通过编写 MEX 文件,...

    JNI实例 Java调用DLL c++调用Java

    在Java中,通过JNI接口,开发者可以定义native方法,并在C或C++代码中实现这些方法,以便调用DLL中的函数。这涉及到以下步骤: 1. 在Java类中声明native方法。 2. 使用javah工具生成C/C++头文件,该文件定义了JNI...

    Java programming with JNI.pdf

    通过JNI中的Invocation API,可以在本地应用程序中嵌入Java虚拟机 (JVM),从而允许程序员从本地代码中调用Java代码。 本教程主要涉及JNI最常见的两种应用场景:从Java程序中调用C/C++代码以及从C/C++程序中调用Java...

    MATLAB C-C++, Fortran, Java, and Python API Reference-MathWorks

    - MATLAB C/C++ API允许程序员在C或C++代码中调用MATLAB函数和变量,执行MATLAB计算,并将结果返回到C/C++程序中。这通常用于加速计算密集型任务,或者在现有C/C++应用程序中嵌入MATLAB功能。 - API提供了诸如创建...

    Java_programming_with_JNI

    JNI的Invocation API可以用于在本地应用程序中嵌入Java虚拟机(JVM),从而允许程序员从本地代码中调用Java代码。该手册主要涉及JNI的两个最常见应用:从Java程序中调用C/C++代码,以及从C/C++程序中调用Java代码。 ...

    Android Java代码与JNI交互 JNI访问Java类方法 (七)

    - 本地方法是用C或C++编写,嵌入到Java应用程序中的函数。 2. **设置JNI环境** - 创建一个Java类,并声明本地方法,如`native void doSomething();` - 使用`javah`命令生成对应的C/C++头文件,包含JNI函数原型。...

    lua学习资料 实现java与c c++程序集成

    在"lua学习资料 实现java与c c++程序集成"这个主题中,我们将深入探讨如何利用Lua来实现与其他编程语言,特别是Java和C/C++的集成。 1. **Lua的语法**:Lua的语法简洁明了,易于学习。它支持变量、常量、数据类型...

    C++调用java代码的JNI实现

    通过JNI,开发者可以在Java应用中嵌入C或C++编写的代码。这对于提高性能、访问硬件资源以及与其他非Java语言编写的应用程序进行交互都非常有用。 ### JAVA代码结构与功能 #### powersys.util.JNITools 类 这个类...

    有关java jni详解

    2. **在C/C++项目中嵌入Java虚拟机**:有时需要在用C/C++开发的应用程序中嵌入Java虚拟机,例如在游戏引擎中加入脚本支持。 3. **实现Java虚拟机**:对于那些想要从底层实现Java虚拟机的人来说,理解JNI是如何工作的...

    C++与Java混合编程 < C++、MFC >

    底层的指令或核心算法,会使用C/C++处理,涉及数据处理的时候,为了安全和快速开发,会使用Javascript或Python等脚本语言实现数据分析处理。因此,开发者应该学习或掌握语言混合编程。 C++和Java是主流的两种编程...

    java中RCP中使用JNI

    通过JNI,开发者可以在Java应用中嵌入C/C++代码,解决Java在某些场景下性能不足的问题,或者利用现有的本地库资源。 2. **在Java RCP中使用JNI的动机** - **性能优化**:对于需要高性能计算或者图形处理的任务,...

    C++与Java混合编程

    通过JNI,开发者可以在Java程序中嵌入C++代码以利用其高性能特性。 2. **JNA (Java Native Access)**:与JNI不同,JNA提供了一种更简单的途径来访问现有C库中的函数,而无需编写任何本地代码。这种方式特别适用于...

Global site tag (gtag.js) - Google Analytics