`
eriol
  • 浏览: 408980 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用Java调用C/C++

    博客分类:
  • Java
阅读更多

我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了:

  • 你的Java代码需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。
  • 在本地还有一个别的系统,不过它不是Java语言实现的,这个时候你需要把两套系统整合到一起。
  • 你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。

 

对于上述的三种情况,如果没有JNI的话,那就会变得异常棘手了。JNI其实是Java Native Interface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C&C++)。

 

在Java中有一些native方法,这些方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。它提供了一个调用(invoke)的接口,然后用C或者C++去实现。

 

 

JNI概述

JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,它是一种双向的接口,使得开发者可以通过Java代码调用到各种native的库,反之亦然。所以JNI(Java Native Interface)能作为Java语言的一部分,她能够作为粘合剂将Java应用和其他本地应用(C/C++,Delphi)集合在一起。

 

JNI

 

作为一个双向的接口,JNI能支持两种native代码:native libraries 和native applications。

  • 你能使用JNI去写一些native methods去允许Java Applications能呼叫native libraries中的函数,native methods的具体实现是可能C,C++或者Delphi。
  • JNI也支持嵌入一个JVM实现到一个本地应用程序中去,去执行那些用Java语言编写的的模块.比如,一个C++编写的浏览器利用内嵌的JVM去执行下载到本地的applet。

 

实现步骤:

1) 完成Java代码,编写好Java调用类。

2) 编译你的Java类。

3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件。

4) 实现头文件中的函数原型,编写native代码。

5) 将native代码编译打包成DLL库(win32)或共享库(Linux)。

6) 将你的Java代码跑起来

 

 

例子

 

1. 编写Java代码。

注意:

(1) 调用本地代码的java方法,要设置成native的。

(2) 要使用System的LoadLibrary方法去加载包含本地方法实现的库。

 

package eric.test;

public class JNITest {
	
	static {
		System.loadLibrary("JNITest");
	}
	
	public static native void sayHelloWorld(String msg);
	
	public static void main(String[] args) {
		sayHelloWorld("Hello, world");
	}
}
 

2. 编译生成的class文件:JNITest.class

 

3. 在命令行下使用javah生成C/C++头文件。在工程的bin目录下输入以下命令:

 

javah -classpath . -jni eric.test.JNITest

 
将生成头文件eric_test_JNITest.h,内容如下:

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class eric_test_JNITest */

#ifndef _Included_eric_test_JNITest
#define _Included_eric_test_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     eric_test_JNITest 
 * Method:    sayHelloWorld
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif
 

注意,在执行javah的时候,要输入完整的包名和类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。

 

4. 实现C++代码。在VS2008中创建一个Win32 project,类型为DLL。

 

将刚才生成的头文件eric_test_JNITest.h拷到工程目录下,并且在项目中导入到Header Files里面。打开StdAfx.h文件,在最后面添加:

 

#include "jni.h"
#include "eric_test_JNITest.h"

 

打开JNITest.cpp文件,在其中添加实现代码。函数名为头文件中定义的函数声明。

 

#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld
  (JNIEnv* env, jclass method, jstring param)
{
	const char* pt = env->GetStringUTFChars(param, 0); 
    cout << pt << " called by Java Native Interface" << endl; 
}

 

其中,GetStringUTFChars是jre中提供的jni方法,用来得到java string的字符串。

 

5. 构建C++项目。会出现"Cannot open include file: 'jni.h': No such file or directory"的错误,解决方法是将以下文件拷贝到C++工程目录下

  • %JAVA_HOME%\include\jni.h
  • %JAVA_HOME%\include\win32\jni_md.h

同时将头文件eric_test_JNITest.h中的 #include <jni.h> 改为

 

 #include "jni.h"

 

然后重新build,将在debug目录下生成JNITest.dll文件。

 

6. 将dll文件复制到Java工程的bin目录下(这个位置十分重要,否则会出现not found的异常),并运行程序

 

java eric.test.JNITest
 

将输出结果"Hello, world called by Java Native Interface"。

 

0
2
分享到:
评论

相关推荐

    java调用C/C++全过程

    ### Java调用C/C++全过程详解 #### 一、引言 随着软件开发技术的不断发展,跨平台的应用程序越来越受到开发者的青睐。Java作为一种典型的跨平台编程语言,因其一次编写到处运行的特点而广受欢迎。然而,Java作为一...

    JAVA调用C/C++ DLL文件方法

    JAVA调用C/C++ DLL文件方法 JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java ...

    java调用C/C++过程

    Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。对于那些需要利用C或C++的高性能特性的Java开发者来说,JNI是一个重要的工具。...

    jni java调用c/c++

    Java 通过 JNI 调用 C/C++ 实现动态库加载 Java Native Interface (JNI) 是 Java虚拟机(JVM)提供的一种接口,允许 Java 代码和本地代码(如 C/C++)之间的交互。通过 JNI,Java 程序可以调用 C/C++ 代码,实现 ...

    java调用C/C++的例子

    Java调用C/C++是跨语言编程中常见的一种技术,主要通过Java的Native Interface (JNI) 实现。JNI 是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,尤其是C和C++。在很多情况下,这可以利用现有的...

    使用JNI进行混合编程:在Java中调用C/C++本地库

    本教程将深入讲解如何使用JNI在Java中调用C/C++的本地库。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的...

    Java 调用C/C++程序

    总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会增加代码的复杂性,但其灵活性和性能提升对于许多项目...

    java写的一个使用jni调用c/c++的dll

    标题中的"java写的一个使用jni调用c/c++的dll"意味着我们要创建一个Java项目,该项目包含一个或多个`native`方法,这些方法的实现将在C/C++中完成。接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    JNI学习指南(java 调用C/C++接口)

    ### JNI学习指南:Java调用C/C++接口详解 #### 一、引言 随着软件开发领域的不断发展,跨语言编程成为一种重要的技能。Java作为一种广泛使用的编程语言,因其跨平台特性和丰富的生态系统受到欢迎。然而,Java作为一...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    本项目是一个关于Android NDK入门的实例,展示了如何混合使用Java和C/C++代码。我们将深入探讨这个主题,了解其关键概念、步骤以及实际应用。 首先,NDK的主要目的是为Android应用提供原生代码支持。原生代码通常比...

    android调用C/C++

    总结来说,Android调用C/C++主要涉及JNI的使用,包括本地方法声明、头文件生成、C/C++代码编写、库编译、Java调用等多个步骤。通过这个过程,开发者可以充分利用C/C++的性能优势来优化应用程序的关键部分。如果在...

    java调用c c++程序实例

    首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...

    JNI 教程 java与c/c++互相调用

    2. **Java调用C/C++** - **本地方法接口**:Java代码通过`System.loadLibrary()`加载动态链接库(DLL或SO),然后通过`native`方法调用C/C++函数。 - **JNI函数注册**:C/C++代码需要使用`RegisterNatives()`函数...

    android studio项目java C/C++ 相互调用

    它定义了一套API,让Java代码可以调用C/C++函数,反之亦然。在Android中,JNI是实现Java和C/C++交互的关键。 2. **创建NDK项目** 在Android Studio中,可以通过创建一个新的Android Studio项目,并选择包含C/C++...

    Android app调用C/C++方法

    这种情况下,Android的JNI(Java Native Interface)框架提供了调用C/C++代码的能力。本篇文章将深入探讨如何在Android应用中调用C/C++方法。 首先,JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码...

Global site tag (gtag.js) - Google Analytics